PassFront
  1. PassFront
  2. База знаний
  3. Асинхронность и Event Loop

Как получить результат первого выполнившегося Promise, запущенного через Promise.all()

Асинхронность и Event Loop

`Promise.all()` не даёт результат первого выполнившегося — она ждёт ВСЕ. Для первого завершившегося используют `Promise.race()`, для первого успешного — `Promise.any()`.

Promise.all не подходит

Promise.all ждёт все промисы и возвращает массив всех результатов — она не про «первый выполнившийся»:

Promise.all([p1, p2, p3]); // ждёт ВСЕ, результат — массив [r1, r2, r3]

Для первого завершившегося — Promise.race

Возвращает результат (или ошибку) первого завершившегося промиса:

const first = await Promise.race([p1, p2, p3]);
// результат самого быстрого (успех ИЛИ ошибка)

Применение: таймауты, «кто быстрее».

Для первого успешного — Promise.any

Возвращает первый успешно завершившийся (игнорируя ошибки, пока есть шанс):

const first = await Promise.any([p1, p2, p3]);
// первый fulfilled; если все упали — AggregateError

Применение: несколько источников, достаточно любого успешного.

Различие race и any

  • race — первый завершившийся (успех или ошибка).
  • any — первый успешный (ошибки игнорируются).

Итог

Вопрос содержит противоречие: Promise.all не даёт первый результат. Нужно:

  • Первый завершившийся → Promise.race.
  • Первый успешный → Promise.any.

Коротко для собеседования

Promise.all() не даёт первый результат — она ждёт ВСЕ (массив всех результатов, fail-fast при ошибке). Для первого завершившегося (успех или ошибка) — Promise.race(); для первого успешного — Promise.any(). race — для таймаутов, any — когда достаточно любого успешного из нескольких источников.

Другие вопросы раздела