假设我有一个像这样的端点的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不是一个选项,除非我能以某种方式返回结果,而不是解析()它们。
答案 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));
我不确定这里的确切用法,但是当你使用co
或Bluebird.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));
}