Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: async, Promise.all, concurrent requests, REST API, fetch

Как выполнить несколько REST-запросов параллельно?

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

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

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

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

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

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

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

async function fetchMultipleUrls(urls) {
  try {
    // Создаём массив промисов-запросов
    const promises = urls.map(url => fetch(url).then(res => res.json()));
    // Ждём выполнения всех промисов параллельно
    const results = await Promise.all(promises);
    console.log('Все данные получены:', results);
    return results;
  } catch (error) {
    console.error('Один из запросов завершился ошибкой:', error);
  }
}

// Использование
const apiEndpoints = [
  'https://api.example.com/users/1',
  'https://api.example.com/posts?userId=1'
];
fetchMultipleUrls(apiEndpoints);

Альтернативы для обработки ошибок

Если важно получить результаты даже для частично неудачных запросов, используйте Promise.allSettled(). Он ждёт завершения всех промисов и возвращает массив объектов с статусом (fulfilled или rejected) и значением или причиной ошибки.

const promises = [
  fetch('/api/data1'),
  fetch('/api/data2'),
  fetch('/api/invalid-endpoint') // Может завершиться ошибкой
];

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

Ограничение количества одновременных запросов

При работе с большим количеством запросов или ограниченным API может потребоваться ограничить параллелизм, чтобы не превысить лимиты сервера. Для этого можно использовать различные паттерны, например, разбивать массив на чанки или использовать готовые библиотеки (p-limit).

// Простой пример с ограничением в 2 одновременных запроса
async function fetchWithConcurrency(urls, limit) {
  const results = [];
  for (let i = 0; i < urls.length; i += limit) {
    const chunk = urls.slice(i, i + limit);
    const chunkResults = await Promise.all(chunk.map(url => fetch(url)));
    results.push(...chunkResults);
  }
  return results;
}

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

  • Node.js

    Node.js

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

#async

#Promise.all

#concurrent requests

#REST API

#fetch

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