Вопрос нужен, чтобы оценить, понимает ли кандидат различие между Promise и setTimeout и их место в очередях задач.
setTimeout помещает колбэк в очередь макрозадач. Promise внутри него создаётся и резолвится уже во время выполнения этой макрозадачи. Микрозадачи Promise будут выполнены сразу после завершения текущего колбэка setTimeout, но до следующей макрозадачи. Это влияет на порядок выполнения кода.
Асинхронность в JavaScript основана на очередях задач, и setTimeout с Promise задействуют разные уровни этой системы.
Перед разбором примера важно понимать:
setTimeout → макрозадача
Promise.then / await → микрозадача
Микрозадачи всегда выполняются раньше следующей макрозадачи.
setTimeout(() => {
Promise.resolve().then(() => {
console.log('promise')
})
}, 0)
console.log('sync')
Последовательность:
Выполняется синхронный код
Колбэк setTimeout попадает в очередь макрозадач
После его выполнения добавляется микрозадача Promise
Микрозадача выполняется до следующей макрозадачи
Promise внутри setTimeout не «обгоняет» синхронный код
Но он выполняется раньше других таймеров
Это важно при оптимизации и дебаге асинхронного кода
Promise, созданный внутри setTimeout, выполняется в рамках макрозадачи таймера, а его обработчики — как микрозадачи сразу после неё. Понимание этого порядка критично для предсказуемого асинхронного поведения.