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这个特性

后记
惆怅,许愿一个实习…