@architect/deploy
Version:
Deploys @architect projects
62 lines (46 loc) • 1.22 kB
JavaScript
module.exports = function eachAsync (arr, parallelLimit, iteratorFn, cb) {
var pending = 0
var index = 0
var lastIndex = arr.length - 1
var called = false
var limit
var callback
var iterate
if (typeof parallelLimit === 'number') {
limit = parallelLimit
iterate = iteratorFn
callback = cb || function noop () {}
}
else {
iterate = parallelLimit
callback = iteratorFn || function noop () {}
limit = arr.length
}
if (!arr.length) { return callback() }
var iteratorLength = iterate.length
function shouldCallNextIterator () {
return (!called && (pending < limit) && (index < lastIndex))
}
function iteratorCallback (err) {
if (called) { return }
pending--
if (err || (index === lastIndex && !pending)) {
called = true
callback(err)
}
else if (shouldCallNextIterator()) {
processIterator(++index)
}
}
function processIterator () {
pending++
var args = (iteratorLength === 2) ? [ arr[index], iteratorCallback ]
: [ arr[index], index, iteratorCallback ]
iterate.apply(null, args)
if (shouldCallNextIterator()) {
processIterator(++index)
}
}
processIterator()
}