Skip to content

Commit 92df6f4

Browse files
committed
feat: add promises all settled
1 parent 2d987a2 commit 92df6f4

File tree

1 file changed

+59
-2
lines changed

1 file changed

+59
-2
lines changed

js/promise.js

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* @Author: Chacha
33
* @Date: 2022-04-19 22:33:05
44
* @Last Modified by: Chacha
5-
* @Last Modified time: 2022-04-19 22:40:07
5+
* @Last Modified time: 2022-04-20 23:28:20
66
*/
77

88
/**
@@ -12,6 +12,10 @@
1212

1313
Promise.myAll = (promises) => {
1414
return new Promise((resolve, reject) => {
15+
if (!Array.isArray(promises)) {
16+
return reject("Promise.myAll accepts an array");
17+
}
18+
1519
let count = 0;
1620
let result = [];
1721
const length = promises.length;
@@ -31,12 +35,63 @@ Promise.myAll = (promises) => {
3135
});
3236
};
3337

38+
Promise.myAllSettled = (promises) => {
39+
return new Promise((resolve, reject) => {
40+
if (!Array.isArray(promises)) {
41+
return reject("Promise.myAllSettled accepts an array");
42+
}
43+
44+
const length = promises.length;
45+
let result = [];
46+
let remaining = length;
47+
48+
if (length === 0) {
49+
return resolve(length);
50+
}
51+
52+
const response = (i, value) => {
53+
if (value instanceof Promise) {
54+
value.then(
55+
(res) => {
56+
response(i, res);
57+
},
58+
(err) => {
59+
result[i] = {
60+
status: "rejected",
61+
reason: err,
62+
};
63+
64+
if (--remaining === 0) {
65+
resolve(result);
66+
}
67+
}
68+
);
69+
70+
return;
71+
}
72+
73+
result[i] = {
74+
status: "fulfilled",
75+
value,
76+
};
77+
78+
if (--remaining === 0) {
79+
resolve(result);
80+
}
81+
};
82+
83+
for (let i = 0; i < length; i++) {
84+
response(i, promises[i]);
85+
}
86+
});
87+
};
88+
3489
let p1 = Promise.resolve(1);
3590
let p2 = 2;
3691
let p3 = new Promise((resolve) => {
3792
setTimeout(resolve, 100, 3);
3893
});
39-
// let p4 = Promise.reject("出错啦");
94+
let p4 = Promise.reject("出错啦");
4095

4196
Promise.myAll([p1, p2, p3])
4297
.then((res) => {
@@ -45,3 +100,5 @@ Promise.myAll([p1, p2, p3])
45100
.catch((err) => {
46101
console.log("err", err);
47102
});
103+
104+
Promise.myAllSettled([p1, p2, p4]).then(console.log);

0 commit comments

Comments
 (0)