Асинхронный JavaScriptСтатические методы промисовmedium

Полифил Promise.allSettled

Необходимо реализовать полифил стандартного метода Promise.allSettled.

Пример работы

Допустим, у нас есть три промиса:

  • p1 резолвится значением "🐢" через 2 секунды
  • p2 реджектится значением "💣" через 3 секунды
  • p3 резолвится значением "🐈" через 1 секунду

allSettled принимает массив [p1, p2, p3] и возвращает новый промис, который дожидается, когда все промисы отработают (успешно или неуспешно) и резолвится массивом объектов определенного вида.

Если промис реджектнулся, то для него мы записываем статус rejected и поле reason, если промис резолвнулся, то статус rejected и поле value.

allSettled([p1, p2, p3]).then(arr => { console.log(arr); // [ // { status: "fulfilled", value: "🐢" }, // { status: "rejected", reason: "💣" }, // { status: "fulfilled", value: "🐈" }, // ] });

Дополнительные требования

Подробное описание того, как работает Promise.allSettled можно прочитать на mdn.

  • allSettled принимает iterable, например, Array или Set.
  • Элементы этого iterable могут быть промисами или не промисами.
  • Если значение в iterable не является промисом, то оно в том же виде попадает в ответ.
  • Итоговый промис резолвится массивом, содержащим информацию о промисах в том же порядке, в каком промисы находились в iterable.
  • Если передается пустой iterable, итоговый промис резолвится пустым массивом.

Код для тестирования

const rand = () => Math.random() * 2000; const p1 = new Promise(r => setTimeout(r, rand(), "A")); const p2 = new Promise(r => setTimeout(r, rand(), "B")); const p3 = new Promise(r => setTimeout(r, rand(), "C")); const p4 = new Promise(r => setTimeout(r, rand(), "D")); allSettled([p1, p2, p3, p4]).then( value => console.log("1 >>>", value), reason => console.log("2 >>>", reason), );