JavaScript中的Generator函数
前言
在学习Async
的时候可以先学习generator
函数
generator
是ES6提出的一种特性,基于这个特性,可以去分段的执行函数
也就是函数执行到某一行,跳出之后可以重新进入到上次的状态
Generator
Generator 意思为生成器
在js中,Generator是一种特殊的函数
Generator的关键字为在function
和括号之间加一个*
号
以及在函数体内使用yield
关键字
1 | function* fn() { |
简单点讲,生成器函数可以在yield
的位置暂停执行,返回yield
紧接着的表达式的值
运行一个Generator函数会返回一个生成器对象
通过调用next
方法可以得到迭代器(Iterator)对象
可以通过next
放方法获取下一个yield
的值
1 | function* fn() { |
通过执行函数得到一个生成器对象,这时候函数是还没有执行的
需要通过不断地调用next
函数来进行执行
可以看出,next
返回的对象value
属性的值对应yield
后面的表达式的值
而done
则是表明此时迭代是否结束的标志
这也就是迭代器的结构
如果我们不写return 3
,而是直接返回的话,就可以使用循环来判断是否到达了迭代的末尾
1 | function* fn() { |
当然,我们可以给每次调用的next
传入参数,传入的参数作为yield
的返回值
1 | function* fn() { |
generator
有什么好处呢
比如我们现在需要一个函数来生成唯一id的话
不使用generator
可以这么写
1 | let id = 0; |
由于函数无法记忆状态,所以只能将变量放在全局
这样会造成变量污染
还可以使用闭包来改进上面的函数
1 | const getId = (function getId() { |
如果使用generator
,看起来会更加直观
1 | function* getId() { |
在MDN上可以看到,除了next
方法之外
generator
对象还有return
和throw
return
函数用于直接结束生成器,即把生成器置于完成状态
1 | function* fn() { |
throw
用于向生成器抛出一个异常
1 | function* fn() { |
throw
返回的也是一个迭代器对象
如果此时生成器还能继续到达下一个yield
的话
那么返回的就是下一个yield
如果不能到达,那么返回的迭代器对象里面的done
为true
1 | function* fn() { |
需要注意,ie不支持generator
这个特性
后记
惆怅,许愿一个实习…