Определение последовательности вывода в консоль (пример 15)

В обычном выполнении вывод будет 0, 2, 6, 3, 5, 1. Promise executor выполняется синхронно, then — после текущего кода, а таймеры — отдельными задачами.

Короткий ответ

Что ответить на собеседовании

В обычном выполнении вывод будет 0, 2, 6, 3, 5, 1. Promise executor выполняется синхронно, then — после текущего кода, а таймеры — отдельными задачами.

Подробный разбор

Ответ с пояснениями

Условие

Укажите, какие значения появятся в консоли при выполнении следующего фрагмента JavaScript‑кода:

 console.log('0');

setTimeout(function timeout() {
    console.log('1');
}, 100);

let p = new Promise(function(resolve, reject) {
    console.log('2');
    resolve();
});

p.then(function() {
    console.log('3');
});

setTimeout(function timeout() {
    console.log('5');
}, 0);

console.log('6');

Ответ

В обычном выполнении вывод будет 0, 2, 6, 3, 5, 1. Promise executor выполняется синхронно, then — после текущего кода, а таймеры — отдельными задачами.

Сначала идут console.log('0'), executor с '2' и завершающий синхронный '6'. Затем микрозадача then печатает '3'. Нулевой таймер обычно срабатывает раньше таймера на 100 мс, поэтому далее ожидаются '5' и '1'.

Длительность setTimeout задаёт минимальную задержку, не точное время. При паузах отладчика, остановке потока или особенностях окружения не следует использовать взаимный порядок разных задержек как механизм синхронизации. Надёжная последовательность бизнес-операций задаётся зависимостями Promise, а не подбором таймаутов.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее