摘要:从语法上,可以将函数理解为一个状态机,它封装了多个内部状态。返回的遍历器对象,可以依次遍历函数内部的每一个状态。
基本概念 理解
Generator函数是ES 6提供的一种异步编程解决方案。从语法上,可以将Generator函数理解为一个状态机,它封装了多个内部状态。执行Generator函数会返回一个遍历器对象,也就是说Generator函数除了是一个状态机,还是一个遍历器对象生成函数。返回的遍历器对象,可以依次遍历Generator函数内部的每一个状态。
为什么使用Generator最大的好处就是函数可以被暂停执行并保持上下文,这个运行方式在处理那些需要暂停的任务时非常有用,而被维持的上下文是为了在将来对运行环境进行恢复。
语法 Generator函数Generator函数以function *申明开头,并在需要暂停运行的地方添加yield关键字
function* myGenerator(){ // A yield "foo" // B }
执行上面的myGenerator方法会创建一个Generator对象,我们可以通过next方法来控制函数执行。运行next方法会执行myGenerator函数中的代码,直到碰到下一个yield表达式(执行完yield才暂停),此时yield后的表达式的值就被返回出去了,而且myGenerator的执行就暂停了,当我们再次运行next方法时,myGenerator会在上次暂停的地方接着向下运行。
const g = myGenerator() const state01 = g.next() // {value: "foo", done: false} const state02 = g.next() // {value: undefined, done: true}yield
yield是伴随着Generator函数出现的,它允许我们返回多个值(多个状态)。然而我们只能在Generator中才能使用它。如果我们尝试在回调函数中用yield一个值,即使在Generator函数内部声明的,也会抛出错误
yield*yield*是用来在一个Generator函数内部调用另一个Generator函数的
function* foo(){ yield "foo" } function* bar(){ yield "bar" yield* foo() yield "bar again" } const b = bar() b.next() // {value: "bar", done: false} b.next() // {value: "foo", done: false} b.next() // {value: "bar again", done: false} b.next() // {value: undefined, done: true}遍历
由于Generator方法会返回一个遍历器对象(可遍历对象),因此我们可以使用一个遍历方法,例如for-of遍历该对象内部的所有状态(值)
for-of遍历
// 接上一个的例子 for (let e of bar()) { console.log(e) } /* 依次输出 bar foo bar again */ 注意,b对应的遍历器对象已经遍历完毕,因此下面的例子只会输出undefined for (let e of b) { console.log(e) } // undefined
解构运算实现遍历
console.log([...bar()]) // ["bar", "foo", "bar again"]return
我们可以在Generator函数中增加return语句
function* myGenerator(){ yield "foo" yield "bar" return "done" } var g = myGenerator() g.next() // {value: "foo", done: false} g.next() // {value: "bar", done: false} g.next() // {value: "done", done: true} g.next() // {value: undefined, done: true}
但是如果使用for-of或者解构运算来遍历遍历器对象,则return后面的值将被忽略
for(let e of myGenerator()) { console.log(e) } // foo // bar console.log([...myGenerator]) // ["foo", "bar"]参考资料
ES6 Generator 探秘
ECMAScript 6 入门
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/87094.html
阅读 2900·2021-10-14 09:43
阅读 2797·2021-10-14 09:42
阅读 4519·2021-09-22 15:56
阅读 2329·2019-08-30 10:49
阅读 1566·2019-08-26 13:34
阅读 2318·2019-08-26 10:35
阅读 564·2019-08-23 17:57
阅读 1967·2019-08-23 17:15