Как объединить результаты двух параллельных запросов A и B без использования Promise.all?

Запустите оба запроса сразу, обработайте ошибки и соберите результаты через счётчик завершений. Разбираем объединение ответов без Promise.all.

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

Что ответить на собеседовании

Запустите оба запроса до ожидания результатов и сразу подключите каждому промису обработчики успеха и ошибки. Создайте общий промис: сохраняйте ответы A и B по исходным индексам и считайте успешные завершения. После двух успехов вызовите resolve с обоими результатами, при первой ошибке — reject. Так порядок ответов не зависит от того, какой запрос завершился раньше.

Подробный разбор

Ответ с пояснениями

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

  • В JavaScript асинхронные операции выполняются с помощью Promise и колбеков
  • Запустите оба запроса параллельно — вызовите их без await
  • Поскольку каждый запрос возвращает Promise, обработайте его через .then()
  • В каждом обработчике then сохраните полученный результат, например во внешней переменной
  • Когда завершится второй запрос, объедините значения A и B вручную
  • Для контроля состояния используйте счётчик завершённых операций или специальный флаг
  • Допустим вариант с async/await и последовательным контролем, однако параллельный запуск выполняется через два промиса с раздельными обработчиками
  • Ещё один вариант — реализовать собственный механизм синхронизации, например на основе событий

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

Подробный ответ

Основной ответ

Если использование Promise.all запрещено, два асинхронных запроса можно запустить независимо, а их результаты обработать через отдельные промисы либо с помощью async/await. Важно сначала инициировать оба запроса параллельно, а затем дождаться завершения каждого из них отдельно. Например, вызовите оба промиса без ожидания, после чего ожидайте каждый через await или then. Полученные значения можно сохранить во внешних переменных и объединить после завершения операций.

Ключевые моменты

  • Инициируйте оба запроса до await, например через const promiseA = fetchA(); const promiseB = fetchB();, чтобы они выполнялись одновременно, а не запускались один за другим.
  • После этого дождитесь каждого результата отдельно: const a = await promiseA; const b = await promiseB;. Так сохраняется параллельное выполнение без применения Promise.all.
  • Этот способ удобен, когда требуется более детально управлять запросами: например, по-разному обрабатывать ошибки отдельных операций, не останавливая весь процесс.
  • Учитывайте, что отдельное использование await не превращает запросы в последовательные, если оба промиса были запущены заранее.

Практический контекст

В прикладных системах, например при использовании fetch API в React 18+, несколько запросов часто запускают одновременно, чтобы сократить задержку примерно до 50–100 мс. По сравнению с последовательным вызовом await fetchA(); await fetchB(); это обеспечивает меньшую latency. Отказ от Promise.all может быть обусловлен необходимостью раздельно обрабатывать ошибки или объединять данные после успешного завершения каждого запроса.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее