Javascript ES6 Generators

Javascript ES6 Generators

本文关键字:Generators ES6 Javascript      更新时间:2023-09-26

我正在深入研究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();

要直接回答您的问题,您不能,因为生成器函数内部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);
});