Выбор ответа Junior Асинхронные паттерны спрашивают часто обновлено
forEach с async-колбэком
Вопрос
Что выведет код?
[1, 2, 3].forEach(async (n) => {
await null;
console.log(n);
});
console.log('done');
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: done 1 2 3. forEach вызывает колбэк и не ждёт возвращённый промис.
Варианты ответа
done 1 2 3правильный ответ1 2 3 donedone, а числа не выведутся1 done 2 3
Разбор
forEach вызывает колбэк и не ждёт возвращённый промис. Каждый колбэк доходит до await и откладывает остаток в микрозадачи. Синхронный done выводится первым, потом микрозадачи: 1 2 3.
- Чтобы дождаться, нужен
for...ofсawaitилиawait Promise.all(arr.map(...)). - Числа выведутся: микрозадачи выполняются, их просто никто не ждёт.
- Первая итерация тоже уходит в микрозадачу, поэтому
1не может опередитьdone.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
EventEmitter синхронный или нет
Следующий вопрос
Что выведет: await, then, nextTick и таймер