|
1 |
| -function promisePool(options) { |
2 |
| - function PromisePoolResolver({max_parallel, next_promise, next_promise_data, threads}) { |
3 |
| - const self = this |
4 |
| - this.resolver = function(resolve, _reject) { |
5 |
| - self.max = max_parallel || threads |
6 |
| - self.started = 0 |
7 |
| - self.ended = 0 |
8 |
| - self.next_promise = Array.isArray(next_promise) ? [...next_promise] : next_promise |
9 |
| - self.next_promise_data = next_promise_data |
10 |
| - self.results = [] |
11 |
| - function startNext(self, thread) { |
12 |
| - const context = { |
13 |
| - index: self.started, |
14 |
| - thread, |
15 |
| - data: self.next_promise_data, |
16 |
| - ended: false |
17 |
| - } |
18 |
| - const next = Array.isArray(self.next_promise) ? self.next_promise.shift() : self.next_promise({ index: self.started, data: self.next_promise_data }) |
19 |
| - self.started += 1 |
20 |
| - if (next && next.then) { |
21 |
| - //console.log('promise ' + JSON.stringify(context)) |
22 |
| - next.then(function(result) { |
23 |
| - context.ended = self.ended |
24 |
| - self.ended += 1 |
25 |
| - //console.log(`promise ${context.index} resolved`) |
26 |
| - self.results[context.index] = { context, promise: next, result: result } |
27 |
| - startNext(self, thread) |
28 |
| - }).catch(function(err) { |
29 |
| - context.ended = self.ended |
30 |
| - self.ended += 1 |
31 |
| - //console.log(`promise ${context.index} rejected`) |
32 |
| - self.results[context.index] = { context, promise: next, error: err } |
33 |
| - startNext(self, thread) |
34 |
| - }) |
35 |
| - } else { |
36 |
| - self.live -= 1 |
37 |
| - if (self.live <= 0) { |
38 |
| - resolve(self.results) |
39 |
| - } |
40 |
| - } |
| 1 | +function promisePool({max_parallel, next_promise, next_promise_data, threads, promises, user_data}) { |
| 2 | + var promises_generator = promises || next_promise |
| 3 | + var self = { |
| 4 | + threads: max_parallel || threads, |
| 5 | + started: 0, |
| 6 | + ended: 0, |
| 7 | + promises_generator: Array.isArray(promises_generator) ? [...promises_generator] : promises_generator, |
| 8 | + next_promise_data: next_promise_data || user_data, |
| 9 | + results: [] |
| 10 | + } |
| 11 | + self.live = self.threads |
| 12 | + var promise = new Promise(function(resolve, _reject) { |
| 13 | + function startNext(self, thread) { |
| 14 | + const context = { |
| 15 | + index: self.started, |
| 16 | + thread, |
| 17 | + data: self.next_promise_data, |
| 18 | + ended: false |
41 | 19 | }
|
42 |
| - self.live = self.max |
43 |
| - for (var i=0; i<self.max; i+=1) { |
44 |
| - startNext(self, i) |
| 20 | + const next = Array.isArray(self.promises_generator) ? self.promises_generator.shift() : self.promises_generator({ index: self.started, data: self.next_promise_data }) |
| 21 | + self.started += 1 |
| 22 | + if (next && next.then) { |
| 23 | + //console.log('promise ' + JSON.stringify(context)) |
| 24 | + next.then(function(result) { |
| 25 | + context.ended = self.ended |
| 26 | + self.ended += 1 |
| 27 | + //console.log(`promise ${context.index} resolved`) |
| 28 | + self.results[context.index] = { context, promise: next, result: result } |
| 29 | + startNext(self, thread) |
| 30 | + }).catch(function(err) { |
| 31 | + context.ended = self.ended |
| 32 | + self.ended += 1 |
| 33 | + //console.log(`promise ${context.index} rejected`) |
| 34 | + self.results[context.index] = { context, promise: next, error: err } |
| 35 | + startNext(self, thread) |
| 36 | + }) |
| 37 | + } else { |
| 38 | + self.live -= 1 |
| 39 | + if (self.live <= 0) { |
| 40 | + resolve(self.results) |
| 41 | + } |
45 | 42 | }
|
46 | 43 | }
|
47 |
| - } |
48 |
| - return new Promise(new PromisePoolResolver(options).resolver) |
| 44 | + for (var i=0; i<self.threads; i+=1) { |
| 45 | + startNext(self, i) |
| 46 | + } |
| 47 | + }) |
| 48 | + promise.poolState = self |
| 49 | + return promise |
49 | 50 | }
|
50 | 51 |
|
51 | 52 | module.exports = promisePool
|
0 commit comments