Вопрос проверяет понимание поведения Promise.all при возникновении ошибки в одном из промисов, что важно для обработки асинхронных операций.
Promise.all — это метод, который принимает итерируемую коллекцию промисов и возвращает один промис. Этот возвращённый промис завершается успешно, только когда все переданные промисы завершаются успешно. Его результат — массив значений в том же порядке, что и исходные промисы.
Ключевая особенность Promise.all — его реакция на ошибку. Если любой из переданных промисов завершается с ошибкой (переходит в состояние rejected), то Promise.all немедленно завершается с этой же ошибкой. Это происходит, не дожидаясь результатов остальных промисов. Даже если другие промисы уже завершились успешно, их результаты игнорируются.
Рассмотрим пример, где два промиса завершаются успешно, а один — с ошибкой.
const promise1 = Promise.resolve('Успех 1');
const promise2 = Promise.reject(new Error('Ошибка!'));
const promise3 = Promise.resolve('Успех 3');
Promise.all([promise1, promise2, promise3])
.then(results => {
console.log('Все успешно:', results); // Этот блок не выполнится
})
.catch(error => {
console.error('Поймана ошибка:', error.message); // Выведет: "Поймана ошибка: Ошибка!"
});В этом примере catch сработает сразу, как только promise2 отклонится. Результаты promise1 и promise3 не будут доступны.
Такое поведение полезно, когда несколько асинхронных операций критически зависят друг от друга, и ошибка в одной делает бессмысленным продолжение обработки остальных. Например, при параллельной загрузке нескольких обязательных ресурсов для страницы.
Если нужно дождаться завершения всех промисов независимо от их результата (например, для логирования или сбора статистики), следует использовать Promise.allSettled. Он всегда дожидается завершения всех промисов и возвращает массив объектов с описанием результата каждого (со статусом fulfilled или rejected).
Вывод: Используйте Promise.all, когда вам нужен "быстрый отказ" и все операции должны завершиться успешно для дальнейшей логики. Если нужно обработать результаты всех операций, включая неудачные, выбирайте Promise.allSettled.