> Как определить момент завершения всех промисов с ошибками для вызова reject в JavaScript? (JavaScript)

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

Компании: Яндекс

Стек: JavaScript

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

Для обработки всех промисов с учётом ошибок используйте Promise.allSettled(). Он возвращает массив объектов с полями status ("fulfilled" или "rejected") и соответствующим value или reason. Если нужно вызвать reject после завершения всех промисов (например, при наличии хотя бы одной ошибки), можно сделать так:

JAVASCRIPT
async function handleAllPromises(promises) {
const results = await Promise.allSettled(promises);
const errors = results
.filter(result => result.status === 'rejected')
.map(result => result.reason);
if (errors.length > 0) {
return Promise.reject(new AggregateError(errors, 'Некоторые промисы завершились ошибкой'));
}
return results
.filter(result => result.status === 'fulfilled')
.map(result => result.value);
}
// Использование:
const promises = [Promise.resolve(1), Promise.reject('Ошибка'), Promise.resolve(3)];
handleAllPromises(promises)
.then(values => console.log('Успех:', values))
.catch(error => console.error('Ошибка:', error.message, error.errors));

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

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

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