Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: Promise.all, async, error handling, JavaScript promises

В чем особенность Promise.all при ошибке одного из промисов?

Вопрос проверяет понимание поведения Promise.all при возникновении ошибки в одном из промисов, что важно для обработки асинхронных операций.

Короткий ответ

Promise.all ожидает выполнения всех переданных промисов. Если хотя бы один промис завершится с ошибкой (rejected), то весь Promise.all немедленно завершается с этой ошибкой, игнорируя результаты остальных промисов (даже если они успешно завершились). Это поведение называется "быстрым отказом" (fail-fast). Для обработки ошибок без прерывания всего процесса можно использовать Promise.allSettled.

Длинный ответ

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.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#Promise.all

#async

#error handling

#JavaScript promises

Подпишись на React Developer в телеграм