一、介绍
-
Generator 函数是 ES6 提供的一种异步编程解决方案。
-
执行 Generator 函数会返回一个遍历器对象,可以依次遍历 Generator 函数内部的每一个状态
-
形式上,Generator函数是一个普通函数,但是有两个特征:
- 1、
function关键字与函数名之间有一个星号
- 2、
函数体内部使用yield表达式,定义不同的内部状态
- 1、
二、使用
1、yield与next()的使用
function* foo(x) {
console.log('first');
var y = 2 * (yield (x + 1));
console.log('second');
var z = yield (y / 3);
console.log('third');
return (x + y + z);
}
var a = foo(5);
a.next() // first Object{value:6, done:false}
a.next() // second Object{value:NaN, done:false}
a.next() // third Object{value:NaN, done:true}
var b = foo(5);
b.next() // first { value:6, done:false }
b.next(12) // second { value:8, done:false }
b.next(13) // third { value:42, done:true }
-
首次调用next()方法表示开始执行generator函数
-
之后在执行时遇到yield表达式,就
暂停执行yield表达式之后的操作,但是yield表达式要执行,并且将yield表达式之后的值作为返回对象的value值
。比如说上面的generator函数,
第一次调用next(),yield表达式x+1会执行,但是2*(yield (x+1))并不会执行 -
再次调用next(val)方法,继续向下执行,同时val参数可作为yield返回对象的value值,继续向下执行,如果没有传则默认为NaN。如此往复,直到执行完毕。
注意:yield返回的对象中done表示执行状态,是否执行完毕