Запустите оба запроса до ожидания результатов и сразу подключите каждому промису обработчики успеха и ошибки. Создайте общий промис: сохраняйте ответы A и B по исходным индексам и считайте успешные завершения. После двух успехов вызовите resolve с обоими результатами, при первой ошибке — reject. Так порядок ответов не зависит от того, какой запрос завершился раньше.
Как объединить результаты двух параллельных запросов A и B без использования Promise.all?
Запустите оба запроса сразу, обработайте ошибки и соберите результаты через счётчик завершений. Разбираем объединение ответов без Promise.all.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Как объединить результаты параллельных запросов без 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 может быть обусловлен необходимостью раздельно обрабатывать ошибки или объединять данные после успешного завершения каждого запроса.