diff --git a/lib/helpers/parallelLimit.js b/lib/helpers/parallelLimit.js new file mode 100644 index 00000000000..6e18781faed --- /dev/null +++ b/lib/helpers/parallelLimit.js @@ -0,0 +1,51 @@ +'use strict'; + +module.exports = parallelLimit; + +/*! + * ignore + */ + +function parallelLimit(fns, limit, callback) { + let numInProgress = 0; + let numFinished = 0; + let error = null; + + if (fns.length === 0) { + return callback(); + } + + for (let i = 0; i < fns.length && i <= limit; ++i) { + _start(); + } + + function _start() { + fns[numFinished + numInProgress](_done(numFinished + numInProgress)); + ++numInProgress; + } + + const results = []; + + function _done(index) { + return (err, res) => { + --numInProgress; + ++numFinished; + + if (error != null) { + return; + } + if (err != null) { + error = err; + return callback(error); + } + + results[index] = res; + + if (numFinished === fns.length) { + return callback(null, results); + } else if (numFinished + numInProgress < fns.length) { + _start(); + } + }; + } +} diff --git a/lib/model.js b/lib/model.js index 2069b3c8131..b1d529ec544 100644 --- a/lib/model.js +++ b/lib/model.js @@ -38,7 +38,7 @@ const isPathSelectedInclusive = require('./helpers/projection/isPathSelectedIncl const get = require('./helpers/get'); const leanPopulateMap = require('./helpers/populate/leanPopulateMap'); const modifiedPaths = require('./helpers/update/modifiedPaths'); -const parallelLimit = require('async/parallelLimit'); +const parallelLimit = require('./helpers/parallelLimit'); const util = require('util'); const utils = require('./utils');