ES6中引入了generator

function* get() {
    var result1 = yield c;
    var result2 = yield b;
    var result3 = yield a;
    console.log(result1);
    console.log(result2);
    console.log(result3);
    return "a";
}

当调用get方法的时候,返回一个迭代器对象。var myGenerator=get();

yield关键字是用来返回迭代中的值的,每调用一次.next()方法,则返回一个yield后的值。

var one=myGenerator.next(); 返回一个object,格式为{done:false,value:c};

done标识是否迭代完成,当为true的时候则迭代完成,value为迭代出的值,此时的值为第一个yield后的值。

如果两次yield之间有代码,则是执行代码到第二次yield;

第二次调用后返回{done:false,value:b}

当第四次调用next的时候,yield a后的代码就会执行,并返回{done:false,value:"a"(如果迭代器没有返回值,则为undefined))}

对于迭代器对象可以使用for of进行迭代,即for(var item of myGenerator){};

 

利用迭代器可以实同步操作

function co(generator) {
    function next() {
        var part = generator.next("迭代");
        if (!part.done) {
            part.value(next);
        } else {
            console.log("完成");
        }
    }
    next();
}
function a() {
    setTimeout(function () {
        console.log(1);
    }, 1000);
     return "a";
}
function b(next) {
    setTimeout(function () {
        console.log(2);
        next();
         return "b";
    }, 2000);
   
}
function c(next) {
    setTimeout(function () {
        console.log(3);
        next();
    }, 3000);
     return "c";
}
function* get() {
    var result1 = yield c;
    var result2 = yield b;
    var result3 = yield a;
    console.log(result1);
    console.log(result2);
    console.log(result3);
    return "a";
}

co(get());

这是参考 

https://cnodejs.org/topic/53474cd19e21582e740117df这位大哥的代码后,自己更加精简的一版。

 

 posted on 2016-01-08 16:59  友方人员  阅读(291)  评论(0编辑  收藏  举报