Как подождать выполнения десяти Promise?
Асинхронность и Event Loop
Десять промисов ждут через `Promise.all([...])` (все успешны или fail-fast) или `Promise.allSettled([...])` (все со статусами). Промисы выполняются параллельно.
Promise.all — все или fail-fast
const promises = urls.map((url) => fetch(url));
const results = await Promise.all(promises); // ждёт все 10- Все успешны → массив из 10 результатов (в порядке входа).
- Любой упал → сразу reject (fail-fast).
Promise.allSettled — все со статусами
Дождаться всех, даже если часть упала:
const results = await Promise.allSettled(promises);
// [{ status: 'fulfilled', value }, { status: 'rejected', reason }, ...]Параллельность
Промисы запускаются одновременно (при создании) — Promise.all только агрегирует. Время = самого долгого, а не суммы:
// Параллельно — время ~= max
await Promise.all([p1, p2, ..., p10]);
// Последовательно (медленно) — время = сумма
for (const url of urls) await fetch(url); // запросы стартуют по очереди — не делать такОграничение параллелизма (если нужно)
Если 10 запросов сразу нагружают сервер — батчить по N (библиотека p-limit или чанки):
for (const chunk of chunks(urls, 3)) {
await Promise.all(chunk.map((url) => fetch(url))); // запросы создаются внутри чанка
}Как выбирать
- Нужны все, fail-fast → Promise.all.
- Нужны все, терпимы ошибки → Promise.allSettled.
- Достаточно первого →
Promise.race/Promise.any.
Коротко для собеседования
Десять промисов ждут через Promise.all([...]) (все результаты по порядку, fail-fast при ошибке) или Promise.allSettled([...]) (все со статусами, не падает). Промисы выполняются параллельно — время = самого долгого, не суммы. Не делать последовательные await в цикле. При нагрузке — ограничивать параллелизм (p-limit).