> Как работает Promise.all и как реализовать аналог с обработкой reject в JavaScript (JavaScript)

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

Компании: Garage Eight, Kodix, РСХБ, IT-One, Библио-Глобус, EPAM, ЛигаСтавок

Стек: JavaScript

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

Promise.all принимает массив промисов (или итерируемый объект) и возвращает новый промис, который резолвится массивом результатов в том же порядке, когда все переданные промисы успешно завершатся. Если хотя бы один промис отклоняется (reject), Promise.all немедленно отклоняется с ошибкой первого отклонённого промиса, игнорируя остальные.

Для реализации аналога с обработкой reject, можно создать функцию promiseAllSettled (аналог встроенного Promise.allSettled), которая ждёт завершения всех промисов и возвращает массив объектов с полями status и value или reason. Пример:

JAVASCRIPT
function promiseAllSettled(promises) {
return new Promise((resolve) => {
const results = [];
let completed = 0;
const total = promises.length;
if (total === 0) {
resolve(results);
return;
}
promises.forEach((promise, index) => {
Promise.resolve(promise)
.then((value) => {
results[index] = { status: 'fulfilled', value };
})
.catch((reason) => {
results[index] = { status: 'rejected', reason };
})
.finally(() => {
completed++;
if (completed === total) {
resolve(results);
}
});
});
});
}

Использование:

JAVASCRIPT
const p1 = Promise.resolve(1);
const p2 = Promise.reject('Ошибка');
const p3 = Promise.resolve(3);
promiseAllSettled([p1, p2, p3]).then(console.log);
// [
// { status: 'fulfilled', value: 1 },
// { status: 'rejected', reason: 'Ошибка' },
// { status: 'fulfilled', value: 3 }
// ]

Эта функция обрабатывает reject, не прерывая выполнение, и возвращает полную информацию о каждом промисе.

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

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