> Как реализовать функцию any, которая работает как Promise.any? (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Т-Банк, Яндекс

Стек: JavaScript

> Пример ответа

Promise.any принимает итерируемый объект с промисами и возвращает новый промис, который резолвится первым успешно выполненным промисом. Если все промисы отклонены, возвращается AggregateError.

Вот реализация, эмулирующая поведение Promise.any:

JAVASCRIPT
function 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, содержащим все ошибки.

Пример использования:

JAVASCRIPT
const p1 = Promise.reject('Ошибка 1');
const p2 = Promise.resolve('Успех');
const p3 = Promise.reject('Ошибка 2');
promiseAny([p1, p2, p3]).then(console.log); // "Успех"

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью