以下为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状态及结果。