如何 运行 并行生成器函数?
How to run Generator Functions in Parallel?
假设我有一个 Koa 网络服务器,其端点如下:
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 不是一种选择,除非我能以某种方式 return 结果,而不是 resolve() 它们。
如果将生成器用作协程,通过模拟 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));
}
co
将生成器函数转换为 Promises,并异步执行它们。 Promise.all
等待全部完成:
exports.getResults = function* () {
var actions = [...];
return yield Promise.all(actions.map(function(action) {
return co(function*() {
return yield perform(action);
}
}));
}
如果您使用的是 redux saga,请遵循此 link
https://redux-saga.js.org/docs/advanced/RunningTasksInParallel/
假设我有一个 Koa 网络服务器,其端点如下:
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 不是一种选择,除非我能以某种方式 return 结果,而不是 resolve() 它们。
如果将生成器用作协程,通过模拟 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));
}
co
将生成器函数转换为 Promises,并异步执行它们。 Promise.all
等待全部完成:
exports.getResults = function* () {
var actions = [...];
return yield Promise.all(actions.map(function(action) {
return co(function*() {
return yield perform(action);
}
}));
}
如果您使用的是 redux saga,请遵循此 link
https://redux-saga.js.org/docs/advanced/RunningTasksInParallel/