Вопрос проверяет понимание приоритета microtasks над macrotasks.
Promise.then всегда выполняется раньше, чем setTimeout, даже если таймер имеет задержку 0. Это происходит потому, что then попадает в очередь microtasks, а setTimeout — в очередь macrotasks. После завершения синхронного кода event loop сначала очищает очередь microtasks, и только потом берёт следующую macrotask.
Этот вопрос — частный случай работы event loop, но его часто задают на собеседованиях.
Promise.then — microtasksetTimeout — macrotask
setTimeout(() => {
console.log("timeout");
}, 0);
Promise.resolve().then(() => {
console.log("promise");
});
promise
timeout
setTimeout(() => {
console.log("timeout");
Promise.resolve().then(() => console.log("promise in timeout"));
}, 0);
Promise.resolve().then(() => {
console.log("promise");
});
Синхронный код завершился.
Выполнился promise.
Выполнился timeout.
Выполнился promise in timeout.
Promise.then имеет приоритет над setTimeout, потому что microtasks выполняются раньше macrotasks.