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 及更高版本