Выбор ответа Junior Асинхронные паттерны спрашивают часто обновлено

Последовательные await и Promise.all

Вопрос

Функции getUser() и getOrders() независимы и идут по 300 мс каждая. Сколько займёт этот код и как его ускорить?

const user = await getUser(id);
const orders = await getOrders(id);

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Около 600 мс; ускорить через Promise.all для обоих. Второй запрос стартует только после того, как первый завершился, поэтому времена складываются.

Варианты ответа

  1. 300 мс: await сам распараллеливает соседние вызовы
  2. Около 600 мс; ускорить через Promise.all для обоихправильный ответ
  3. Около 600 мс; ускорить, убрав await у второго вызова
  4. Около 600 мс, и ускорить нельзя: JS однопоточный

Разбор

Второй запрос стартует только после того, как первый завершился, поэтому времена складываются. Promise.all запускает оба сразу и ждёт оба: около 300 мс.

  • await ничего не распараллеливает, он ждёт.
  • Без await в orders окажется промис, а не данные.
  • Однопоточность не мешает: пока идёт сетевой запрос, поток свободен и может ждать второй.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме