一尘不染

如何并行运行生成器函数?

node.js

假设我有一台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;
}

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

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

注意:除非我能以某种方式返回结果而不是resolve(),否则将它们变为Promises是不可行的。


阅读 275

收藏
2020-07-07

共1个答案

一尘不染

co将生成器功能转换为Promises,并异步执行它们。Promise.all等待他们全部完成:

exports.getResults = function* () {

    var actions = [...];

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