假设我有一台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是不可行的。
co将生成器功能转换为Promises,并异步执行它们。Promise.all等待他们全部完成:
co
Promise.all
exports.getResults = function* () { var actions = [...]; return yield Promise.all(actions.map(function(action) { return co(function*() { return yield perform(action); } })); }