【问题标题】:Javascript ES6 GeneratorsJavascript ES6 生成器
【发布时间】:2015-01-30 08:41:15
【问题描述】:

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

【问题讨论】:

  • 你实际上想要完成什么,流控制?
  • 类似的东西。我不知道具体是什么,这是我第一次玩它。
  • 我的意思是,在你的具体例子中,如果你结合你的第一个和第二个例子,你可以通过it.next.bind(it)。但根据用例,可能会有更好的答案。但是不行,生成器不能直接访问其.next 函数而不捕获范围内的对象。

标签: javascript generator ecmascript-6


【解决方案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);
});

【讨论】:

    猜你喜欢
    • 2015-08-08
    • 2016-06-17
    • 2018-04-14
    • 2020-08-08
    • 1970-01-01
    • 2017-01-10
    • 2014-02-28
    • 2016-07-23
    • 2016-04-14
    相关资源
    最近更新 更多