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

Как подождать выполнения десяти 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).

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