1、定义和使用
function *gen() { return 'first generator'; } // 有点类似类的实例化过程 let generatorResult = gen() // 核心方法next generatorResult.next() // {value: "first generator", done: true} // Generator 如同一个序列:一旦序列中的值被消费,你就不能再次消费它。 generatorResult.next() // undefined
2、next() / value
function *gen() { yield 'fitst'; yield 'second'; yield 'third'; } let genResult = gen(); genResult.next().value // first genResult.next().value // second genResult.next().value // third
3、for ... of ...
function *gen() { yield 'fitst'; yield 'second'; yield 'third'; } for (const value of gen()) { console.log(value); } // fitst // second // third
4、next() 往 generator 中赋值
function *gen() { var firstname = yield; var secondname = yield; console.log(firstname + secondname); } var genResult = gen() genResult.next() genResult.next('Mr. ') genResult.next('Right') // Mr. Right // 解释一下,由于yield可以理解为暂停器。 // 当第一次调用 next 时,代码将返回并且暂停于此: var firstname = yield; // 有趣的事情发生在第二次调用 next 时: genResult.next('Mr. ')。 // 此时我们向 next 调用传入了值!Generator将从上一次暂停中恢复,并且 yield将被 "Mr. " 替换。因此firstname的值变成'Mr. ' // 然后继续执行,而又遇到yield处再次暂停: genResult.next('Right') // 第三次调用 next: genResult.next('Right') // 同前面一样,传入的 'Right' 将替换 yield,并在赋值完后继续执行。 // 由于没有yield了。所以正常执行了: genResult.next('Right') // Mr. Right
5、使用gen异步操作
let gen; let getDataOne = () => { setTimeout(function () { gen.next('one') }, 1000); } let getDataTwo = () => { setTimeout(function () { gen.next('two') }, 1000); } function *main() { let dataone = yield getDataOne(); let datatwo = yield getDataTwo(); console.log(dataone, datatwo); } gen = main(); gen.next(); // {value: undefined, done: false} // 1秒后输出: one two