Вопрос проверяет понимание приоритета 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.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию