Skip to content

Instantly share code, notes, and snippets.

@tweinfeld
Last active October 15, 2015 10:03
Show Gist options
  • Save tweinfeld/c385a09b3be53a70eb23 to your computer and use it in GitHub Desktop.
Save tweinfeld/c385a09b3be53a70eb23 to your computer and use it in GitHub Desktop.
Limit execution concurrency of promise generation functions
let allConcurrent = function(limit, generators){
return new Promise(function(resolveAll){
let plan = generators.map((generator)=>({ value: undefined, executed: false, settled: false, generator: generator }));
let executeBatch = () => {
plan
.filter(({ settled, executed })=> !executed || (executed && !settled))
.slice(0, limit)
.filter(({ executed }) => !executed)
.map(planItem => {
planItem.executed = true;
var next = (val) => { Object.assign(planItem, { settled: true, value: val}); executeBatch(); }
planItem.generator().then(next, next);
})
.length || (plan.every(({ settled }) => settled) && resolveAll(plan.map(({value}) => value)));
}
executeBatch();
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment