Выбор ответа Junior Промисы и async/await спрашивают часто обновлено

Последовательные await и время выполнения

Вопрос

Каждый вызов load занимает 1 секунду, вызовы независимы. Сколько примерно займёт a() и сколько b()?

async function a() {
  const x = await load('x');
  const y = await load('y');
  const z = await load('z');
  return [x, y, z];
}
async function b() {
  return Promise.all([load('x'), load('y'), load('z')]);
}

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

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

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

Коротко

Правильный ответ: a около 3 с, b около 1 с. В a каждый следующий load вызывается только после того, как дождались предыдущего, поэтому время складывается.

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

  1. a около 3 с, b около 1 справильный ответ
  2. Обе около 1 с: движок сам распараллелит независимые await
  3. Обе около 3 с: JavaScript однопоточный
  4. a около 1 с, b около 3 с

Разбор

В a каждый следующий load вызывается только после того, как дождались предыдущего, поэтому время складывается. В b все три запроса запускаются сразу, и Promise.all ждёт самый долгий, примерно 1 с. Движок не переставляет await сам: порядок вызовов задаёт код. Однопоточность не мешает параллельному ожиданию: ожидание сети ведёт окружение, а не JS-поток.

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

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

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