【发布时间】:2016-04-08 20:46:59
【问题描述】:
这几天我开始了解 ES6 版本中引入的 JavaScript 中的 Generator 函数。
有很多地方解释了生成器,但对我来说似乎太有趣的是,到处都在说
生成器函数是一种同步编写异步代码的方法。
我想提出的问题是“为什么有必要仅仅为了它而引入一种完全不同的编程策略?”
我了解 JS 代码的异步特性使新手难以理解和调试代码,但是否需要完全改变编码风格?
我可能错了,或者没有完全理解它的介绍背后的概念,但对这一切的好奇是促使我提出这个问题的原因。
【问题讨论】:
-
它们不仅仅是编写异步代码:生成器提供了一个可以永远运行的函数,有时会暂停,并允许在迭代中交换值。
-
哦,我同意这一点,但你能给我一个我需要那种功能的用例吗?
-
您可以使用它们来生成 GUID、访问数据存储等。我什至在一个之上构建了一个基于文本的冒险游戏,发送用户命令,并接收每个收益的玩家状态。这种使用主要是出于好奇:)
-
如果您将其视为现在可以使用生成器制作的“假装自上而下”代码,它并不完全是“新手友好”,所以我认为这不是实现工匠的动机。稍后当我们开始对巨大/无限/慢速对象使用自定义迭代时,真正的力量可能会很明显。
-
单独的生成器不允许您“同步”编写异步代码(顺便说一句,这听起来很误导)。 Generators + Promises 允许你这样做。但这仍然很奇怪,因此我们将来会得到
async/await。我认为async/await只不过是生成器 + 承诺很漂亮,但我一直认为这是生成器的(可能是精心策划的)副作用。