如何并行运行发生器function?

假设我有一个像这样的端点的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; } 

现在客户在所有的操作执行完后都会得到回应。 但事情是每个行动都依赖于以前的完成。

有没有办法同时执行它们?

注意:将它们转换为Promise不是一种select,除非我能以某种方式返回结果,而不是parsing()它们。

如果生成器被用作协同程序,通过模拟async / awaitstream程,那么你应该能够做到:

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

甚至:

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

我不确定这里的确切用法,但是当你使用带有co或者Bluebird.coroutine generator的时候,你已经使用了promise,所以你可以更明确地使用它们。

所以,而不是:

 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)); } 

co将生成器函数转换为Promises,并执行asynchronous。 Promise.all等待他们完成:

 exports.getResults = function* () { var actions = [...]; return yield Promise.all(actions.map(function(action) { return co(function*() { return yield perform(action); } })); }