Необходимо реализовать полифил стандартного метода Promise.allSettled
.
Допустим, у нас есть три промиса:
"🐢"
через 2 секунды"💣"
через 3 секунды"🐈"
через 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), );