Что выполняется первым: Promise или setTimeout?
Асинхронность и Event Loop
Первым выполнится коллбэк Promise, а не `setTimeout`, даже с задержкой 0. Причина — Promise-коллбэки это микрозадачи, а setTimeout — макрозадача, и микрозадачи имеют приоритет.
Порядок
Event Loop после текущего синхронного кода сначала опустошает всю очередь микрозадач (Promise), и только потом берёт макрозадачу (setTimeout).
console.log('1 sync');
setTimeout(() => console.log('2 timeout'), 0);
Promise.resolve().then(() => console.log('3 promise'));
console.log('4 sync');
// Порядок: 1 sync → 4 sync → 3 promise → 2 timeoutПочему так
- Выполняется весь синхронный код (
1,4). - Опустошается очередь микрозадач →
3 promise. - Берётся макрозадача →
2 timeout.
Более сложный пример
setTimeout(() => console.log('timeout'), 0);
Promise.resolve()
.then(() => console.log('promise 1'))
.then(() => console.log('promise 2'));
// promise 1 → promise 2 → timeoutОбе микрозадачи (цепочка then) выполнятся раньше setTimeout.
Коротко для собеседования
Первым выполнится Promise: его then — микрозадача, а setTimeout — макрозадача. Event Loop опустошает все микрозадачи до следующей макрозадачи, поэтому Promise.then всегда раньше setTimeout(…, 0).