如何并行运行发生器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
/ await
stream程,那么你应该能够做到:
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); } })); }
- 如何使用MongoDB Node.JS驱动程序创build一个新的数据库?
- app.set然后TypeError:app.get不是一个函数
- 如何将一个string转换为nodejs mongodb本地驱动程序中的ObjectId?
- Node.js – 模块caching,部分完成的对象和循环依赖?
- 为什么createServer()被认为不是一个函数?
- 为什么我得到“TypeError:对象不是一个函数”运行这个例子node.js代码?
- 如何在节点的FileSystem.readfile中unit testing逻辑cb
- 为什么在Node.js中默认保持HTTPclosures?
- 将utc时间戳转换为使用偏移量的本地时间秒数