Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: async, Promise, Promise.all, concurrency, asynchronous requests

объединить результаты нескольких асинхронных запросов?

Вопрос проверяет умение работать с несколькими асинхронными операциями одновременно и объединять их результаты, что критично для эффективной загрузки данных в современных веб-приложениях.

Короткий ответ

Для объединения результатов нескольких асинхронных запросов в JavaScript чаще всего используют `Promise.all()`. Этот метод принимает массив промисов и возвращает новый промис, который выполнится, когда все переданные промисы завершатся успешно. Если хотя бы один промис завершится с ошибкой, весь `Promise.all` также завершится с ошибкой. Это позволяет выполнять запросы параллельно, а не последовательно, что значительно ускоряет загрузку данных. Альтернативой является `Promise.allSettled()`, который ждёт завершения всех промисов независимо от их статуса.

Длинный ответ

В современной веб-разработке часто возникает необходимость выполнить несколько независимых запросов к API, базе данных или файловой системе и обработать их результаты вместе. Последовательное выполнение (один за другим) приводит к накоплению задержек и плохому пользовательскому опыту. Решением является параллельное выполнение с последующим агрегированием результатов.

Основной подход: Promise.all

Стандартный метод Promise.all(iterable) принимает итерируемую коллекцию (чаще всего массив) промисов и возвращает один промис. Этот результирующий промис переходит в состояние fulfilled (выполнено) только когда все переданные промисы успешно завершатся. Его значением будет массив результатов в том же порядке, в котором передавались промисы. Если любой из промисов завершится с ошибкой (rejected), то и Promise.all немедленно завершится с этой же ошибкой, игнорируя результаты остальных (даже если они уже выполнены).

async function fetchUserData(userId) {
  const [profile, orders, messages] = await Promise.all([
    fetch(`/api/users/${userId}/profile`).then(r => r.json()),
    fetch(`/api/users/${userId}/orders`).then(r => r.json()),
    fetch(`/api/users/${userId}/messages`).then(r => r.json())
  ]);
  return { profile, orders, messages };
}

// Использование
fetchUserData(123)
  .then(data => console.log('Все данные:', data))
  .catch(err => console.error('Один из запросов не удался:', err));

Альтернативные методы

Иногда требуется более гибкое поведение:

  • Promise.allSettled() – ждёт завершения всех промисов и возвращает массив объектов с описанием результата каждого (статус fulfilled или rejected и значение/причина). Полезно, когда нужно обработать все результаты, даже если некоторые запросы завершились с ошибкой.
  • Promise.race() – возвращает результат первого завершившегося промиса (успешно или с ошибкой). Используется для реализации таймаутов.
  • Promise.any() – возвращает результат первого успешно завершившегося промиса. Игнорирует ошибки, пока хотя бы один промис выполнится.
// Пример с allSettled
const promises = [
  fetch('/api/data1'),
  fetch('/api/data2'),
  Promise.reject(new Error('Искусственная ошибка'))
];

const results = await Promise.allSettled(promises);
const successfulData = results
  .filter(r => r.status === 'fulfilled')
  .map(r => r.value);

Где это применяется

Данный подход широко используется при загрузке данных для инициализации страницы (например, профиль пользователя, его настройки и уведомления), агрегации информации из нескольких источников (разные микросервисы, сторонние API) или параллельном выполнении независимых задач (валидация нескольких полей формы, загрузка нескольких изображений).

Вывод: Используйте Promise.all для параллельного выполнения независимых асинхронных операций, когда вам нужны все результаты одновременно и вы готовы обработать возможную ошибку любого из запросов. Для более устойчивой обработки, где ошибки отдельных операций допустимы, выбирайте Promise.allSettled.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

  • Node.js

    Node.js

Ключевые слова

#async

#Promise

#Promise.all

#concurrency

#asynchronous requests

Подпишись на Java Developer в телеграм