Необходимо реализовать полифил стандартного метода Promise.any
.
any
Функция any
принимает промисы и возвращает новый промис. Этот промис резолвится успешно в тот момент, когда зарезолвился первый по времени успешный промис, значением этого промиса.
const p1 = Promise.reject("💣") const p2 = Promise.resolve("✅") any([p1, p2]).then(value => { console.log(value); // "✅" });
Если все промисы реджектнулись, итоговый промис реджектится ошибкой AggregateError
с сообщением "All promises were rejected"
и массивом причин реджекта каждого из промисов.
const p1 = Promise.reject("💣") const p2 = Promise.reject("🌪️") const p3 = Promise.reject("🔥") any([p1, p2, p3]).catch(error => { console.log(error instanceof AggregateError); // true console.log(error.message); // "All promises were rejected" console.log(error.errors); // ["💣", "🌪️", "🔥"] });
Подробное описание того, как работает Promise.any
можно прочитать на mdn.
any
принимает iterable
, например, Array или Set.iterable
могут быть промисами или не промисами.iterable
есть элементы, не являющиеся промисами, то итоговый промис зарезолвится первым из них.iterable
, итоговый промис реджектится ошибкой AggregateError
с пустым массивом errors
.errors
расположины в том же порядке, в каком промисы находились в 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")); any([p1, p2, p3, p4]).then( value => console.log("1 >>>", value), reason => console.log("2 >>>", reason), );