3.5 生成器Generators/yield

最后更新于:2022-04-01 23:33:10

# 生成器Generators/yield Generator Function(生成器函数)和Generator(生成器)是ES6引入的新特性,该特性早就出现在了Python、C#等其他语言中。生成器本质上是一种特殊的迭代器[https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/The_Iterator_protocol](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/The_Iterator_protocol)。 Generator函数本意是iterator生成器,函数运行到yield时退出,并保留上下文,在下次进入时可以继续运行。 生成器函数也是一种函数,语法上仅比普通function多了个星号* ,即function* ,在其函数体内部可以使用yield和yield* 关键字。 简单理解,这是ES6的新特性,function 后面带 * 的叫做Generator,如以下代码所示。 ~~~ function* doSomething() { .... } ~~~ 先看一下Generator如何执行: ~~~ function* doSomething() { console.log('1'); yield; // Line (A) console.log('2'); } var gen1 = doSomething(); gen1.next(); // Prints 1 then pauses at line (A) gen1.next(); // resumes execution at line (A), then prints 2 ~~~ **说明** * gen1是产生出来的Generator对象 * 第一个next,会打印出1,之后悬停在 yield所在行,即Line (A) * 第二个next,恢复line (A)点的执行,之后打印出2 如果有多个yield呢?那么会有无穷无尽的next。 于是tj就写[co](https://github.com/tj/co)这个著名的Generator执行器,co目前已经是v4了,彻底的面向Promise了,个中曲折也是够八卦的了。
';