PassFront
  1. PassFront
  2. База знаний
  3. Асинхронность и Event Loop

Что выполняется первым: 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. Выполняется весь синхронный код (1, 4).
  2. Опустошается очередь микрозадач → 3 promise.
  3. Берётся макрозадача → 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).

Другие вопросы раздела