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

forEach с async-колбэком

Вопрос

Что выведет код?

[1, 2, 3].forEach(async (n) => {
  await null;
  console.log(n);
});
console.log('done');

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

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

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

Коротко

Правильный ответ: done 1 2 3. forEach вызывает колбэк и не ждёт возвращённый промис.

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

  1. done 1 2 3правильный ответ
  2. 1 2 3 done
  3. done, а числа не выведутся
  4. 1 done 2 3

Разбор

forEach вызывает колбэк и не ждёт возвращённый промис. Каждый колбэк доходит до await и откладывает остаток в микрозадачи. Синхронный done выводится первым, потом микрозадачи: 1 2 3.

  • Чтобы дождаться, нужен for...of с await или await Promise.all(arr.map(...)).
  • Числа выведутся: микрозадачи выполняются, их просто никто не ждёт.
  • Первая итерация тоже уходит в микрозадачу, поэтому 1 не может опередить done.

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

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

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