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