В обычном выполнении вывод будет 0, 2, 6, 3, 5, 1. Promise executor выполняется синхронно, then — после текущего кода, а таймеры — отдельными задачами.
Определение последовательности вывода в консоль (пример 15)
В обычном выполнении вывод будет 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, а не подбором таймаутов.