如何并行运行发电机功能?

时间:2017-03-13 16:16:04

标签: javascript node.js koa

假设我有一个像这样的端点的Koa Web服务器:

const perform = require(...); // some generator function

exports.endpoint = function* () {

    var results = yield getResults();

    // Respond the results
    this.body = results;
}

exports.getResults = function* () {

    var actions = [...];
    var results = [];

    for (var action of actions) {

        var result = yield perform(action);

        results.push(results);
    }

    return results;
}

现在客户端将在显然执行所有操作后得到响应。但事情是每个动作都取决于之前的完成。

有没有办法并行执行它们?

注意:将它们转换为Promises不是一个选项,除非我能以某种方式返回结果,而不是解析()它们。

2 个答案:

答案 0 :(得分:2)

co将生成器函数转换为Promises,并执行它们异步。 Promise.all等待所有人完成:

exports.getResults = function* () {

    var actions = [...];

    return yield Promise.all(actions.map(function(action) { 
        return co(function*() { 
            return yield perform(action); 
        } 
    }));
}

答案 1 :(得分:1)

如果将生成器用作协同程序,通过模拟async / await流程,那么您应该可以这样做:

var results = yield Promise.all(actions.map(action => perform(action)));

甚至:

var results = yield Promise.all(actions.map(perform));

我不确定这里的确切用法,但是当你使用coBluebird.coroutine的生成器时,你已经在使用promises,所以你也可以更明确地使用它们。

所以,而不是:

exports.getResults = function* () {

    var actions = [...];
    var results = [];

    for (var action of actions) {

        var result = yield perform(action);

        results.push(results);
    }

    return results;
}

你可以尝试:

exports.getResults = function* () {

    var actions = [...];

    return yield Promise.all(actions.map(perform));
}