为什么生成器不能很好地转换?

Why don't generators transpile well?

我们遵循 airbnb eslint 指南,他们在其中说建议不要使用 generators

  • 11.2 Don't use generators for now.

    Why? They don't transpile well to ES5.

我似乎无法找到任何解释来说明转译不好的含义(不仅在本文档中,而且在 Google 上)。我们正在使用 babel,并且有 polyfills 可以做到这一点。有什么我想念的吗?

他们完全错了(或者文档已经严重过时了)。转译器从生成器和异步函数创建一个基于闭包的状态机。他们不是很好,但工作很快。唯一的缺点是它更难调试(即使使用 sourcemaps)。

另一方面,在某些情况下,不使用生成器会导致尴尬的解决方法,而生成器会提供干净的解决方案。总是先写清楚代码。

编辑

我们开发人员在现实生活中了解到,一些编程挑战最好用 state-machines 来解决。生成器和异步函数为您提供了一个强大的工具来表达其中的大部分 state-machines.

这就是语言的演变方式:我们发现一个重复出现的编程问题有一个解决方案,因此人们创建了一种具有新语法的新编程语言,以便为该问题提供更短的解决方案。这就是我们如何获得基本的数据结构、函数、闭包、classes、第一个 class 函数、GC、RTTI、反射等...今天,您选择使用哪种语言来处理您的问题项目。您可以直接编写机器代码,或使用一些 high-level 托管语言。争论通常是关于执行速度 (汇编应该更快,对吗?)、可移植性和所用语言语法的学习曲线 (我为什么要学习 lambda 和yield 和 async/await 当我总是能够在不使用任何这些的情况下解决任何问题?)。我个人更喜欢使用表达性语言,我相信高级level/managed程序永远不会比原生程序慢。

所以让我强调一下不使用生成器你会失去什么:你最终会写出相同的 hundred-line state-machines(可能伪装成对象和函数的集合)使用明智且熟悉的语法的简短程序。