Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: event loop, microtask, macrotask, Promise, setTimeout

Почему Promise выполняется раньше setTimeout?

Проверяет понимание очередности выполнения микрозадач и макрозадач в event loop JavaScript.

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

Promise относится к микрозадачам, а setTimeout — к макрозадачам. Event loop сначала выполняет все микрозадачи из очереди, прежде чем перейти к следующей макрозадаче. Поэтому Promise выполняется раньше setTimeout, даже если у них одинаковое время задержки.

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

Как работает Event Loop

JavaScript использует event loop для управления асинхронными операциями. В основе лежит цикл, который последовательно обрабатывает задачи из очередей. Существует два типа очередей: очередь микрозадач (microtask queue) и очередь макрозадач (macrotask queue).

Микрозадачи и макрозадачи

Микрозадачи включают Promise.then/catch/finally, MutationObserver и queueMicrotask. Макрозадачи включают setTimeout, setInterval, I/O операции и события DOM. Event loop сначала выполняет одну макрозадачу, затем очищает всю очередь микрозадач, прежде чем взять следующую макрозадачу.

Пример кода

console.log('Start');

setTimeout(() => {
  console.log('setTimeout');
}, 0);

Promise.resolve().then(() => {
  console.log('Promise');
});

console.log('End');
// Вывод: Start, End, Promise, setTimeout

В этом примере сначала выполняется синхронный код (Start, End). Затем event loop проверяет очередь микрозадач и выполняет Promise. Только после этого он берет следующую макрозадачу — setTimeout.

Практическое применение

Понимание этого механизма важно для предотвращения неожиданного порядка выполнения кода. Например, если нужно гарантировать выполнение определенного кода после всех Promise, следует использовать setTimeout с нулевой задержкой, но помнить, что он выполнится после всех микрозадач.

Вывод: Promise выполняется раньше setTimeout из-за приоритета микрозадач над макрозадачами в event loop. Это знание помогает правильно управлять асинхронными операциями и избегать ошибок, связанных с порядком выполнения кода.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    5

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

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

#event loop

#microtask

#macrotask

#Promise

#setTimeout

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

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию