> Каков порядок выполнения setTimeout и промисов в JavaScript при вложенных вызовах (JavaScript)
Уровень: middle · Роль: frontend · Категория: Технические вопросы
Компании: amoCRM, Garage Eight
Стек: JavaScript
> Пример ответа
Порядок выполнения вложенных setTimeout и промисов определяется циклом событий (Event Loop) и очередями задач (Task Queue) и микрозадач (Microtask Queue).
Ключевое правило: Микрозадачи (промисы, queueMicrotask) выполняются до следующей макрозадачи (setTimeout, setInterval, события DOM). При вложенных вызовах это приводит к следующему порядку:
- Сначала выполняется синхронный код.
- Все промисы (включая вложенные
.then()) ставятся в очередь микрозадач и выполняются немедленно после завершения текущего синхронного кода, до обработки следующей макрозадачи. setTimeoutставится в очередь макрозадач и выполняется только после того, как опустеет очередь микрозадач.
Пример:
JAVASCRIPTconsole.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.
> Похожие задачи по frontend
Каковы преимущества optional chaining в JavaScript?
Какие типы данных являются ссылочными в JavaScript?
Как проверить тег элемента в обработчике события клика в JavaScript
Каков порядок вывода консольных логов при использовании setTimeout и промисов в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью