Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: Promise.allSettled, Promise.race, Promise.any, async await, concurrency

Какие есть альтернативы Promise.all?

Вопрос проверяет знание альтернативных методов для параллельного выполнения асинхронных операций в JavaScript, что необходимо для эффективного управления потоком выполнения.

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

Основные альтернативы Promise.all — это Promise.allSettled, Promise.race и Promise.any. Promise.allSettled ждёт завершения всех промисов, независимо от их статуса (успех или ошибка), и возвращает массив результатов с информацией о каждом. Promise.race возвращает результат первого завершившегося промиса (успешного или с ошибкой). Promise.any возвращает результат первого успешно выполнившегося промиса, а если все завершатся с ошибкой, то возвращает AggregateError. Эти методы дают более гибкий контроль над асинхронными операциями.

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

В JavaScript для работы с несколькими асинхронными операциями параллельно часто используют Promise.all, но у него есть ограничение: если хотя бы один промис завершится с ошибкой, весь результат будет отклонён. Для более гибких сценариев существуют другие статические методы класса Promise.

Promise.allSettled

Этот метод ждёт, пока все переданные промисы завершатся (неважно, успешно или с ошибкой), и возвращает массив объектов с детализированными результатами. Каждый объект содержит статус (fulfilled или rejected) и значение либо причину ошибки. Это полезно, когда нужно обработать результаты всех операций, например, при отправке нескольких независимых запросов к API, где неудача одного не должна блокировать обработку остальных.

const promises = [
  Promise.resolve('Успех 1'),
  Promise.reject('Ошибка'),
  Promise.resolve('Успех 2')
];
Promise.allSettled(promises).then(results => {
  results.forEach(result => {
    if (result.status === 'fulfilled') {
      console.log('Успех:', result.value);
    } else {
      console.log('Ошибка:', result.reason);
    }
  });
});
// Вывод: Успех: Успех 1, Ошибка: Ошибка, Успех: Успех 2

Promise.race

Метод возвращает результат первого завершившегося промиса (будь то успех или ошибка). Это можно использовать для реализации таймаутов или выбора самого быстрого источника данных. Например, если у вас есть два сервера, вы можете запустить запросы к обоим и взять ответ от того, который ответит первым.

const fast = new Promise(resolve => setTimeout(() => resolve('Быстрый'), 100));
const slow = new Promise(resolve => setTimeout(() => resolve('Медленный'), 200));
Promise.race([fast, slow]).then(result => console.log(result)); // Вывод: Быстрый

Promise.any

Этот метод похож на Promise.race, но возвращает результат первого успешно выполнившегося промиса. Если все промисы завершатся с ошибкой, будет отклонён с AggregateError, содержащим все ошибки. Это полезно, когда у вас есть несколько резервных источников, и вам нужен первый рабочий.

const p1 = Promise.reject('Ошибка 1');
const p2 = Promise.resolve('Успех 1');
const p3 = Promise.resolve('Успех 2');
Promise.any([p1, p2, p3]).then(result => console.log(result)); // Вывод: Успех 1

Кроме этих методов, можно использовать последовательное выполнение с async/await в цикле или библиотеки типа async.js для сложных потоков, но встроенные методы покрывают большинство случаев.

Вывод: Используйте Promise.allSettled, когда нужны результаты всех операций, Promise.race для таймаутов или гонок, и Promise.any для получения первого успешного результата из нескольких источников. Это позволяет гибко управлять параллелизмом в асинхронном коде.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

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

#Promise.allSettled

#Promise.race

#Promise.any

#async await

#concurrency

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