生成器是一种特殊的函数,它能够自我暂停,并在稍后恢复,允许其他代码在此期间运行。
生成器是一种特殊的函数,它能够暂停自己,并在稍后恢复,允许其他代码在此间运行。
代码决定它必须等待,所以它让其他代码 "在队列中 "运行,并保持 "当它所等待的东西 "完成后恢复其操作的权利。
所有这些都是通过一个简单的关键字完成的:yield 。当一个生成器包含这个关键字时,执行就会停止。
一个生成器可以包含许多yield 关键字,从而使自己多次停止,它由*function 关键字来识别,这与C、C++或Go等低级编程语言中使用的指针解除定义操作符不能混淆。
生成器在JavaScript中实现了全新的编程范式,允许。
- 生成器运行时的双向通信
- 长时间的while循环,不会使你的程序冻结。
下面是一个生成器的例子,它解释了这一切是如何工作的。
function *calculator(input) {
var doubleThat = 2 * (yield (input / 2))
var another = yield (doubleThat)
return (input * doubleThat * another)
}
我们用以下方式初始化它
const calc = calculator(10)
然后我们在生成器上启动迭代器。
这第一个迭代启动了迭代器。代码返回这个对象。
发生的情况是:代码运行函数,input = 10 ,因为它是在生成器构造器中传递的。它一直运行到yield ,并返回yield 的内容:input / 2 = 5 。所以我们得到了一个5的值,并表明迭代还没有完成(函数只是暂停了)。
在第二次迭代中,我们传递了一个值7 。
而我们得到的结果是。
{
done: false
value: 14
}
7 被作为 的值。 重要的是:你可能会读出 是参数,但那只是第一次迭代的返回值。我们现在跳过这一点,使用新的输入值, ,并将其乘以2。doubleThat input / 2 7
然后我们到达第二个收益率,返回doubleThat ,所以返回值是14 。
在下一次,也是最后一次迭代中,我们传入100
并返回我们得到
{
done: true
value: 14000
}
迭代完成后(没有找到更多的收益率关键字),我们只返回(input * doubleThat * another) ,相当于10 * 14 * 100 。