Как получить результат трех параллельных асинхронных запросов?
Асинхронность и 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.