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

Как получить результат трех параллельных асинхронных запросов?

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

Результат трёх параллельных запросов получают через `Promise.all([req1, req2, req3])` — запросы выполняются одновременно, результат — массив в порядке входа.

Promise.all для параллельных запросов

const [users, posts, comments] = await Promise.all([
  fetch('/users').then((r) => r.json()),
  fetch('/posts').then((r) => r.json()),
  fetch('/comments').then((r) => r.json()),
]);
  • Запросы стартуют одновременно (параллельно).
  • Результат — массив в порядке входа (деструктурируем).
  • Время = самого долгого запроса, а не суммы.

Параллельно vs последовательно

// Параллельно (быстро) — время ~= max
const [a, b, c] = await Promise.all([fetchA(), fetchB(), fetchC()]);

// Последовательно (медленно) — время = сумма
const a2 = await fetchA();
const b2 = await fetchB();
const c2 = await fetchC();

Обработка ошибок

Promise.all — fail-fast

При ошибке любого — весь Promise.all падает:

try {
  const [a, b, c] = await Promise.all([...]);
} catch (e) {
  // хотя бы один упал
}

Promise.allSettled — терпимо к ошибкам

Если нужны все результаты, даже при падении части:

const results = await Promise.allSettled([...]);
// [{status, value/reason}, ...]

Как выбирать

  • Нужны все, fail-fast → Promise.all.
  • Нужны все, терпимы ошибки → Promise.allSettled.

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

Три параллельных запроса — Promise.all([r1, r2, r3]): запросы выполняются одновременно, результат — массив по порядку (деструктуризация), время = самого долгого. Не делать последовательные await (медленно). При ошибке любого Promise.all падает (fail-fast); если нужны все несмотря на ошибки — Promise.allSettled.

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