以下为ChatGPT自动生成的解答,正确与否请自行判断。 也许你也可以从大家的发帖中找到想要的答案!
BFE.devAI解答 - JavaScript 代码题
33. 实现`Promise.allSettled()`
可以,实现方式如下:
Promise.allSettled = function(promises) {
return new Promise(resolve => {
const result = [];
let count = 0;
promises.forEach((promise, index) => {
Promise.resolve(promise).then(value => {
result[index] = {status: 'fulfilled', value};
}, reason => {
result[index] = {status: 'rejected', reason};
}).finally(() => {
count++;
if (count === promises.length) {
resolve(result);
}
})
})
})
}
其中,核心代码是使用Promise.resolve()
将每个promise转化为一个新的promise实例,并使用.then()
处理fulfill和reject的情况,将其统一转化为{status: 'fulfilled', value}
或{status: 'rejected', reason}
形式的对象。使用finally()
确保无论如何都能够在promise状态settled后调用resolve()
将所有结果一并返回。
使用示例:
const promise1 = Promise.resolve("Hello World");
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, 'error'));
const promise3 = new Promise((resolve, reject) => setTimeout(resolve, 200, 'done'));
Promise.allSettled([promise1, promise2, promise3]).then(console.log);
输出结果:
[
{status: "fulfilled", value: "Hello World"},
{status: "rejected", reason: "error"},
{status: "fulfilled", value: "done"}
]
可以看到,所有promise状态settled后,返回了一个对象数组,每个元素描述了对应的promise状态及结果。