diff options
Diffstat (limited to 'build-es/internal/eachOfLimit.js')
-rw-r--r-- | build-es/internal/eachOfLimit.js | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/build-es/internal/eachOfLimit.js b/build-es/internal/eachOfLimit.js new file mode 100644 index 0000000..5235278 --- /dev/null +++ b/build-es/internal/eachOfLimit.js @@ -0,0 +1,49 @@ +'use strict'; + +import noop from 'lodash-es/noop'; +import once from 'lodash-es/once'; + +import keyIterator from './keyIterator'; +import onlyOnce from './onlyOnce'; + +export default function _eachOfLimit(limit) { + return function (obj, iterator, callback) { + callback = once(callback || noop); + obj = obj || []; + var nextKey = keyIterator(obj); + if (limit <= 0) { + return callback(null); + } + var done = false; + var running = 0; + var errored = false; + + (function replenish () { + if (done && running <= 0) { + return callback(null); + } + + while (running < limit && !errored) { + var key = nextKey(); + if (key === null) { + done = true; + if (running <= 0) { + callback(null); + } + return; + } + running += 1; + iterator(obj[key], key, onlyOnce(function (err) { + running -= 1; + if (err) { + callback(err); + errored = true; + } + else { + replenish(); + } + })); + } + })(); + }; +} |