ES6生成器

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;
}

yield 递归步骤

8、生成器的使用场景
● 产生一系列值
● 顺序执行的任务队列

猜你喜欢

转载自blog.csdn.net/wuweitiandian/article/details/80724058