> Как реализовать функцию any, которая работает как Promise.any? (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Т-Банк, Яндекс
Стек: JavaScript
> Пример ответа
Promise.any принимает итерируемый объект с промисами и возвращает новый промис, который резолвится первым успешно выполненным промисом. Если все промисы отклонены, возвращается AggregateError.
Вот реализация, эмулирующая поведение Promise.any:
JAVASCRIPTfunction promiseAny(promises) {return new Promise((resolve, reject) => {if (promises.length === 0) {reject(new AggregateError([], 'All promises were rejected'));return;}let rejectedCount = 0;const errors = new Array(promises.length);promises.forEach((promise, index) => {Promise.resolve(promise).then(resolve) // первый успешный резолвит весь промис.catch((error) => {errors[index] = error;rejectedCount++;if (rejectedCount === promises.length) {reject(new AggregateError(errors, 'All promises were rejected'));}});});});}
Как это работает:
-
Используем
Promise.resolve(), чтобы обработать не-промис значения. -
При первом успешном выполнении вызываем
resolveвнешнего промиса. -
Считаем количество отклонённых промисов. Если все отклонены - вызываем
rejectсAggregateError, содержащим все ошибки.
Пример использования:
JAVASCRIPTconst p1 = Promise.reject('Ошибка 1');const p2 = Promise.resolve('Успех');const p3 = Promise.reject('Ошибка 2');promiseAny([p1, p2, p3]).then(console.log); // "Успех"
> Похожие задачи по frontend
В какой очередности выполняются console.log, setTimeout и Promise в JavaScript
Какие примитивные типы существуют в JavaScript?
Почему стрелочную функцию нельзя использовать как конструктор в JavaScript
В чем разница между Promise.all, Promise.any и Promise.race в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью