Как получить результат первого выполнившегося 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 — когда достаточно любого успешного из нескольких источников.