Вывод: 1, 3, 4, 5, 6, 8, 9, 2, 7. Регистрация таймера в then не задерживает продолжение цепочки: следующий then получает возвращённый идентификатор таймера.
Определение порядка вывода в консоль с учётом Event Loop
Вывод: 1, 3, 4, 5, 6, 8, 9, 2, 7. Регистрация таймера в then не задерживает продолжение цепочки: следующий then получает возвращённый идентификатор таймера.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Нужно понять, какие числа будут напечатаны и в какой последовательности, учитывая работу Event Loop, а также очереди микрозадач и макрозадач.
console.log(1);
setTimeout(() => console.log(2), 0);
console.log(3);
Promise.resolve()
.then(() => console.log(4))
.then(() => console.log(5))
.then(() => console.log(6))
.then(() => setTimeout(() => console.log(7), 0))
.then(() => {
console.log(8);
return 9;
})
.then(console.log);
Ответ
Вывод: 1, 3, 4, 5, 6, 8, 9, 2, 7. Регистрация таймера в then не задерживает продолжение цепочки: следующий then получает возвращённый идентификатор таймера.
После синхронных 1 и 3 подряд исполняются микрозадачи цепочки с 4, 5 и 6. Следующий обработчик создаёт таймер 7, но не возвращает Promise ожидания этого таймера.
Поэтому цепочка сразу продолжает микрозадачами: печатает 8, возвращает 9 и передаёт его console.log. Лишь после завершения микрозадач работают таймеры: сначала ранее поставленный 2, затем 7. Чтобы цепочка ждала таймер, надо вернуть Promise, разрешаемый его callback.