Каждый await это один шаг микрозадач
Вопрос
Что выведет код? По строке на каждый вывод.
async function a() {
console.log('a1');
await null;
console.log('a2');
await null;
console.log('a3');
}
a();
Promise.resolve()
.then(() => console.log('p1'))
.then(() => console.log('p2'));
console.log('sync');
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Что выведет
a1
sync
a2
p1
a3
p2
Разбор
a1 синхронно, затем await null ставит продолжение функции в микрозадачи. Цепочка промиса ставит p1. После sync микрозадачи выполняются по очереди: a2 (и следующий await ставит продолжение в конец очереди), затем p1 (и его then ставит p2). Дальше в очереди a3, потом p2. await на не-промисе и then каждый занимают ровно один шаг очереди, поэтому вывод чередуется.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
setImmediate и setTimeout внутри колбэка ввода-вывода
Следующий вопрос
Синхронный executor и await готового промиса