Assuming I have a Koa web server with an endpoint like this:
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;
}
Now the client will get the respond after ALL the actions are performed obviously. but the things is each action is dependent on the completion of the previous.
Is there a way to execute them in parallel?
Note: Turning them to Promises is not an option, unless I can somehow return the results, and not resolve() them.
If the generators are used as coroutines, by simulating the
async
/await
flow, then you should be able to do:or even:
I'm not sure about the exact usage here but when you use generators with
co
orBluebird.coroutine
then you're already using promises, so you may as well use them more explicitly.So, instead of:
you can try:
co
turns the generator function to Promises, and executes them async.Promise.all
waits for all of them to finish: