blob: bbc3a5833368a76923430887ccb6e0006a31b21e [file] [log] [blame]
// dead simple promise pool, inspired by https://github.com/timdp/es6-promise-pool
// but much smaller in code size. limits the number of concurrent promises that are executed
function pool(promiseFactories, limit) {
return new Promise(function (resolve, reject) {
var running = 0;
var current = 0;
var done = 0;
var len = promiseFactories.length;
var err;
function runNext() {
running++;
promiseFactories[current++]().then(onSuccess, onError);
}
function doNext() {
if (++done === len) {
/* istanbul ignore if */
if (err) {
reject(err);
} else {
resolve();
}
} else {
runNextBatch();
}
}
function onSuccess() {
running--;
doNext();
}
/* istanbul ignore next */
function onError(thisErr) {
running--;
err = err || thisErr;
doNext();
}
function runNextBatch() {
while (running < limit && current < len) {
runNext();
}
}
runNextBatch();
});
}
export default pool;