UNPKG

980 BJavaScriptView Raw
1'use strict';
2
3module.exports = parallelLimit;
4
5/*!
6 * ignore
7 */
8
9function parallelLimit(fns, limit, callback) {
10 let numInProgress = 0;
11 let numFinished = 0;
12 let error = null;
13
14 if (limit <= 0) {
15 throw new Error('Limit must be positive');
16 }
17
18 if (fns.length === 0) {
19 return callback(null, []);
20 }
21
22 for (let i = 0; i < fns.length && i < limit; ++i) {
23 _start();
24 }
25
26 function _start() {
27 fns[numFinished + numInProgress](_done(numFinished + numInProgress));
28 ++numInProgress;
29 }
30
31 const results = [];
32
33 function _done(index) {
34 return (err, res) => {
35 --numInProgress;
36 ++numFinished;
37
38 if (error != null) {
39 return;
40 }
41 if (err != null) {
42 error = err;
43 return callback(error);
44 }
45
46 results[index] = res;
47
48 if (numFinished === fns.length) {
49 return callback(null, results);
50 } else if (numFinished + numInProgress < fns.length) {
51 _start();
52 }
53 };
54 }
55}