@trenskow/parallel 0.1.112 → 0.1.114

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/index.js +24 -33
  2. package/package.json +3 -3
  3. package/test.js +4 -4
package/index.js CHANGED
@@ -1,4 +1,4 @@
1
- // Created 2022 by Kristian Trenskow
1
+ // Created 2022-2026 by Kristian Trenskow
2
2
 
3
3
  export default (promises) => {
4
4
 
@@ -7,50 +7,41 @@ export default (promises) => {
7
7
 
8
8
  if (promises.length === 0) return Promise.resolve([]);
9
9
 
10
- promises.forEach((promise) => {
11
- if (typeof (promise || {}).then !== 'function') throw new Error('Promise is not thenable.');
12
- });
13
-
14
- let results = Array(promises.length).fill({});
10
+ let results = Array(promises.length);
11
+ let rejection;
12
+ let completed = 0;
15
13
 
16
14
  return new Promise((resolve, reject) => {
17
15
 
18
16
  const evaluate = () => {
19
17
 
20
- if (!results) return;
21
-
22
- if (results.filter(({ status }) => status).length === promises.length) {
23
-
24
- try {
25
- resolve(results.map((result) => {
26
- if (result.status === 'rejected') throw result.reason;
27
- return result.value;
28
- }));
29
- } catch (error) {
30
- reject(error);
18
+ if (completed === promises.length) {
19
+
20
+ if (typeof rejection !== 'undefined') {
21
+ return reject(rejection);
31
22
  }
32
23
 
33
- results = undefined;
24
+ resolve(results);
34
25
 
35
26
  }
36
27
 
37
28
  };
38
29
 
39
- promises.forEach((promise, idx) => {
40
- promise
41
- .then((value) => {
42
- results[idx] = {
43
- status: 'resolved',
44
- value
45
- };
46
- }, (reason) => {
47
- results[idx] = {
48
- status: 'rejected',
49
- reason
50
- };
51
- })
52
- .then(evaluate);
53
- });
30
+ promises
31
+ .forEach((promise, idx) => {
32
+ Promise.resolve(promise)
33
+ .then((value) => {
34
+ results[idx] = value;
35
+ })
36
+ .catch((reason) => {
37
+ results[idx] = undefined;
38
+ rejection = rejection || reason;
39
+ })
40
+ .finally(() => {
41
+ completed++;
42
+ })
43
+ .then(evaluate);
44
+ });
54
45
 
55
46
  });
56
47
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trenskow/parallel",
3
- "version": "0.1.112",
3
+ "version": "0.1.114",
4
4
  "description": "A small library for doing async tasks in parallel.",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -26,11 +26,11 @@
26
26
  "devDependencies": {
27
27
  "@eslint/eslintrc": "^3.3.5",
28
28
  "@eslint/js": "^10.0.1",
29
- "@trenskow/wait": "^1.3.102",
29
+ "@trenskow/wait": "^1.3.103",
30
30
  "chai": "^6.2.2",
31
31
  "chai-as-promised": "^8.0.2",
32
32
  "eslint": "^10.4.0",
33
33
  "globals": "^17.6.0",
34
- "mocha": "^11.7.5"
34
+ "mocha": "^11.7.6"
35
35
  }
36
36
  }
package/test.js CHANGED
@@ -10,10 +10,6 @@ import parallel from './index.js';
10
10
 
11
11
  describe('parallel', () => {
12
12
 
13
- it ('should throw an error if promises are not provided.', () => {
14
- expect(() => parallel(123)).to.throw('Promise is not thenable.');
15
- });
16
-
17
13
  it ('should throw an error if no promises are provided.', () => {
18
14
  expect(() => parallel()).to.throw('No promises was provided.');
19
15
  });
@@ -47,4 +43,8 @@ describe('parallel', () => {
47
43
  })();
48
44
  });
49
45
 
46
+ it ('should eventually come back with [1, 2, 3] when non-promises', async () => {
47
+ await expect(parallel([0, 1, 2])).to.eventually.eql([0, 1, 2]);
48
+ });
49
+
50
50
  });