📜  JavaScript |发电机

📅  最后修改于: 2022-05-13 01:58:09.694000             🧑  作者: Mango

JavaScript |发电机

与Python生成器一样,JavaScript 也支持生成器函数和生成器对象。
生成器函数:生成器函数的定义与普通函数一样,但每当需要生成值时,它都会使用 yield 关键字而不是 return。 yield 语句暂停函数的执行并将值发送回调用者,但保留足够的状态以使函数能够从中断的地方恢复。恢复后,函数会在最后一次 yield 运行后立即继续执行。
句法 :

// An example of generator function
function* gen(){
     yield 1;
     yield 2;
     ...
     ...
}

Generator-Object :生成器函数返回一个生成器对象。通过调用生成器对象的 next 方法或在“for of”循环中使用生成器对象来使用生成器对象(如上面的程序所示)
Generator 对象由生成函数返回,它同时符合可迭代协议和迭代器协议。

javascript


javascript


javascript


javascript


javascript


javascript


javascript


javascript


javascript


下面是使用简单生成器打印无限系列自然数的示例代码。

javascript


输出

1
2
3
4
5
6
7
8
9
10

以下是如何从生成器手动返回的示例

javascript


遇到 yield 和 yield* 语法
yield:暂停生成器执行并返回在 yield 关键字之后写入的表达式的值。
yield*:它遍历操作数并返回每个值,直到 done 为真。

javascript


输出

1
a
b
c
2

另一种创建可迭代的方法

javascript


如何从生成器中抛出异常

javascript


从另一个生成器调用生成器

javascript


输出

1
2
3
4

发电机的限制
你不能在生成器的回调中屈服

javascript


使用异步生成器(用于 api 调用)

javascript


输出

(after 5 seconds)
1 
(after 3 seconds)
2

发电机的优点:
当发生惰性求值时,它们具有内存效率,即延迟表达式的求值,直到需要它的值。
用例(生成器)

  • 在 redux-saga 中编写生成器
  • async-await (用 promise 和 generators 实现)

支持的浏览器:

  • 谷歌浏览器 39 及更高版本
  • Microsoft Edge 13 及更高版本
  • 火狐 26 及以上
  • Opera 26 及以上
  • Safari 10 及更高版本