Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: microtask, macrotask

В каком порядке выполняются microtask и macrotask?

Вопрос проверяет понимание приоритетов выполнения асинхронных задач в Event Loop и причин “неожиданного” порядка логов.

Короткий ответ

Microtask выполняются раньше macrotask. Сначала выполняется весь синхронный код, затем очищается очередь microtask, и только потом берётся следующая macrotask. Promise.then и queueMicrotask относятся к microtask, а setTimeout — к macrotask. Это влияет на порядок выполнения кода и рендеринг. Понимание порядка помогает правильно писать асинхронную логику.

Длинный ответ

Event Loop выполняет задачи не просто “по очереди”, а с приоритетом: microtask имеют более высокий приоритет, чем macrotask.

Что относится к microtask и macrotask

  1. Microtask queue

    • Promise.then / catch / finally

    • queueMicrotask

    • MutationObserver

  2. Macrotask queue (task queue)

    • setTimeout / setInterval

    • события UI (например, click)

    • сетевые события (в упрощённом понимании)

    • postMessage (часто рассматривают как task)

Порядок выполнения

В одном “цикле” Event Loop типичный порядок такой:

  1. Выполняется весь синхронный код (пока call stack не станет пустым)

  2. Затем выполняются все microtask, которые накопились

  3. Затем браузер может выполнить рендер (если нужно)

  4. Потом берётся следующая macrotask и цикл повторяется

Важно: microtask выполняются до полного опустошения очереди. Если внутри microtask добавить ещё microtask, они тоже будут выполнены в этом же проходе, прежде чем Event Loop перейдёт к macrotask.

Небольшой пример

console.log('start')

setTimeout(() => console.log('timeout'), 0)

Promise.resolve().then(() => console.log('promise'))

console.log('end')

Ожидаемый порядок:

  1. start

  2. end

  3. promise

  4. timeout

Практическое значение во frontend

  • Если “перегрузить” microtask (например, цепочками Promise.then), можно:

    • откладывать обработку setTimeout

    • задерживать реакцию UI

    • ухудшить отзывчивость приложения

Вывод:
В JavaScript после синхронного кода всегда сначала выполняются microtask, и только потом macrotask — это ключ к пониманию порядка выполнения асинхронности.

Уровень

  • Рейтинг:

    5

  • Сложность:

    8

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#microtask

#macrotask

Подпишись на React Developer в телеграм