1、生成器可以在执行当中暂停自身,可以立即恢复执行,也可以过一段时间后恢复执行,在执行当中的每次暂停/恢复,都提供了一个双向信息传递的机会,生成器可以返回一个值,恢复它的控制代码也可以发回一个值。
2、生成器语法
function *fun(){}
// or
function* fun() {}
function * fun() {}
function*fun() {}
3、对象字面量中的简单生成器
var a = {
*fun() {
..
}
}
4、执行
function *foo() {
// ..
}
var it = foo();
it.next();
5、暂停点yield
yield .. 表达式不只发送一个值,没有值的yield等价于yield undefined,而且还会接收最终的恢复值。
function *foo() {
var x = 10;
var y = 20;
yield;
var z = x + y;
}
function *foo2(){
while (true) {
yield Math.random();
}
}
function *foo3(){
var x = yield 10;
console.log(`x=${x}`);
}
var t3 = foo3();
console.log(t3.next()); // { value: 10, done: false }
console.log(t3.next(12));
// x=12
// { value: undefined, done: true }
function *foo4(){
var arr = [yield 1, yield 2, yield3];
console.log( arr , yield 4);
}
6、yield*
yield 委托
function *foo1(){
yield *[1,2,3];
}
function *foo2() {
yield 1;
yield 2;
yield 3;
}
// *bar()调用*foo()的时候产生的迭代器通过yield * 委托,这意味着不管*foo()产生什么值,这些值都会被*bar()产出
function *bar() {
yield *foo2();
}
function *foo3(){
yield 1;
yield 2;
yield 3;
return 4;
}
function *bar2() {
var x = yield *foo();
console.log('x:',x);
}
for(var v of bar2()){
console.log(v);
}
// 1 2 3
// x: 4
7、yield 递归
function *foo(x){
if(x < 3){
x = yield *foo(x + 1);
}
return x * 2;
}
8、生成器的使用场景
● 产生一系列值
● 顺序执行的任务队列