Promise.allSettled() Polyfill

The Promise.allSettled() method returns a promise that fulfills after all of the given promises have either fulfilled or rejected, with an array of objects that each describes the outcome of each promise.

Promise.allSettledPolyfill = (promises) => {
  let pending = promises.length;
  const results = [];
  return new Promise((resolve, reject) => {
    promises.forEach((promise, promiseIndex) => {
      promise
        .then((value) => {
          results[promiseIndex] = {
            status: "fulfilled",
            value: value,
          };
        })
        .catch((error) => {
          results[promiseIndex] = {
            status: "rejected",
            value: error,
          };
        })
        .finally(() => {
          pending--;
          if (pending === 0) {
            resolve(results);
          }
        });
    });
  });
};

Example

Promise.allSettledPolyfill = (promises) => {
  let pending = promises.length;
  const results = [];
  return new Promise((resolve, reject) => {
    promises.forEach((promise, promiseIndex) => {
      promise
        .then((value) => {
          results[promiseIndex] = {
            status: "fulfilled",
            value: value,
          };
        })
        .catch((error) => {
          results[promiseIndex] = {
            status: "rejected",
            value: error,
          };
        })
        .finally(() => {
          pending--;
          if (pending === 0) {
            resolve(results);
          }
        });
    });
  });
};

const a = new Promise((resolve) => resolve(3));
const b = new Promise((resolve, reject) => reject(9));
const c = new Promise((resolve) => resolve(5));

Promise.allSettledPolyfill([a, b, c]).then((val) => {
  console.log(val);
});