> Каков порядок выполнения setTimeout и промисов в JavaScript при вложенных вызовах (JavaScript)

Уровень: middle · Роль: frontend · Категория: Технические вопросы

Компании: amoCRM, Garage Eight

Стек: JavaScript

> Пример ответа

Порядок выполнения вложенных setTimeout и промисов определяется циклом событий (Event Loop) и очередями задач (Task Queue) и микрозадач (Microtask Queue).

Ключевое правило: Микрозадачи (промисы, queueMicrotask) выполняются до следующей макрозадачи (setTimeout, setInterval, события DOM). При вложенных вызовах это приводит к следующему порядку:

  1. Сначала выполняется синхронный код.
  2. Все промисы (включая вложенные .then()) ставятся в очередь микрозадач и выполняются немедленно после завершения текущего синхронного кода, до обработки следующей макрозадачи.
  3. setTimeout ставится в очередь макрозадач и выполняется только после того, как опустеет очередь микрозадач.

Пример:

JAVASCRIPT
console.log('1');
setTimeout(() => {
console.log('2');
Promise.resolve().then(() => console.log('3'));
}, 0);
Promise.resolve().then(() => {
console.log('4');
setTimeout(() => console.log('5'), 0);
});
console.log('6');

Вывод: 1, 6, 4, 2, 3, 5

Объяснение:

  • 1 и 6 - синхронный код.
  • Промис с 4 (микрозадача) выполняется сразу после синхронного кода, внутри него ставится setTimeout с 5.
  • Затем выполняется первый setTimeout (макрозадача) - выводит 2 и ставит микрозадачу с 3.
  • Микрозадача с 3 выполняется до следующей макрозадачи (5).

Таким образом, вложенные промисы всегда "обгоняют" вложенные setTimeout, даже если таймер имеет задержку 0.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью