使用 ES2015 (ES6) 中的生成函数,我们现在可以使用 yield 关键字来定义可以返回多个值的函数。
1function* someGenerator(){
2 yield 'Cats';
3 yield 'Dogs';
4 yield 'Birds';
5}
注意使用函数关键字旁边的 * 字符,表示它是一个生成函数。
现在,让我们创建一个生成器的实例,并通过在生成器上调用 next() 来提取值:
1const gen = someGenerator();
2
3console.log(gen.next().value); // Cats
4console.log(gen.next().value); // Dogs
5console.log(gen.next().value); // Birds
6console.log(gen.next().value); // Undefined
next() 返回一个具有值和完成的布尔式调用的对象,如果生成器没有值,则返回 true:
1const gen2 = someGenerator();
2
3console.log(gen2.next().done); // false
4console.log(gen2.next().done); // false
5console.log(gen2.next().done); // false
6console.log(gen2.next().done); // true
ID 发电机
在生成器函数中,你可以使用无限时来创建一个函数,它每次在它上调用下一个()时都会生成一个新ID,在这种情况下,无限循环并不危险,因为它只会一次执行下一个():
1function* idGen(){
2 let i = 0;
3 while (true) {
4 yield ++i;
5 }
6}
7
8const myIdGen = idGen();
9
10console.log(myIdGen.next().value); // 1
11console.log(myIdGen.next().value); // 2
12console.log(myIdGen.next().value); // 3
13console.log(myIdGen.next().value); // 4