Javascript ES6生成器

时间:2015-01-30 08:41:16

标签: javascript generator ecmascript-6

我潜入了javascript生成器,我真的很困惑。

我使用node@0.11.x来运行此示例:

function find() {
    process.nextTick(function() {  
        it.next(1);
    });
};

var it = (function* main() {
    var k = yield find();

    console.log(k);
})();

it.next();

有没有办法获取生成器内next函数的引用?

类似的东西:

function find(next) {
    process.nextTick(function() {  
        next(1);
    });
};

(function* main() {
    var k = yield find(this.next);

    console.log(k);
})().next();

1 个答案:

答案 0 :(得分:1)

要直接回答你的问题,你不能因为生成器函数中的this不是生成器实例,它是函数调用的上下文。你可以这样做:

function find(next) {
    process.nextTick(function() {  
        next(1);
    });
};

var it = (function* main() {
    var k = yield find(it.next.bind(it));

    console.log(k);
})();

it.next();

但这很难理解。通常,这可以通过像co这样的协程库来完成。有了这个,你就会yield一个承诺,当承诺得到解决后,co将使用承诺解决的值来调用.next

var co = require('co');

function find(){
    return new Promise(function(resolve){
        process.nextTick(function(){
            resolve(1);
        });
    });
}

co(function * (){
    var k = yield find();

    console.log(k);
});