UNPKG

run-parallel-limit

Version:

Run an array of functions in parallel, but limit the number of tasks executing at the same time

71 lines (63 loc) 1.69 kB
/*! run-parallel-limit. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */ module.exports = runParallelLimit const queueMicrotask = require('queue-microtask') function runParallelLimit (tasks, limit, cb) { if (typeof limit !== 'number') throw new Error('second argument must be a Number') let results, len, pending, keys, isErrored let isSync = true let next if (Array.isArray(tasks)) { results = [] pending = len = tasks.length } else { keys = Object.keys(tasks) results = {} pending = len = keys.length } function done (err) { function end () { if (cb) cb(err, results) cb = null } if (isSync) queueMicrotask(end) else end() } function each (i, err, result) { results[i] = result if (err) isErrored = true if (--pending === 0 || err) { done(err) } else if (!isErrored && next < len) { let key if (keys) { key = keys[next] next += 1 tasks[key](function (err, result) { each(key, err, result) }) } else { key = next next += 1 tasks[key](function (err, result) { each(key, err, result) }) } } } next = limit if (!pending) { // empty done(null) } else if (keys) { // object keys.some(function (key, i) { tasks[key](function (err, result) { each(key, err, result) }) if (i === limit - 1) return true // early return return false }) } else { // array tasks.some(function (task, i) { task(function (err, result) { each(i, err, result) }) if (i === limit - 1) return true // early return return false }) } isSync = false }