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

Что такое Event Loop?

Асинхронность и Event Loop

Event Loop (цикл событий) — это механизм, который позволяет однопоточному JavaScript выполнять асинхронный код: он следит за стеком вызовов и очередями задач и решает, что выполнять следующим.

Из чего состоит модель

  • Call Stack — стек, где выполняется синхронный код прямо сейчас.
  • Web API / C++ API — таймеры, сеть, DOM-события живут вне движка (в браузере или Node.js).
  • Macrotask queue — очередь макрозадач: setTimeout, setInterval, обработчики событий, I/O.
  • Microtask queue — очередь микрозадач: коллбэки Promise.then/catch/finally, queueMicrotask, MutationObserver.

Алгоритм работы

  1. Полностью выполняется синхронный код в стеке.
  2. Когда стек пуст — выполняются все микрозадачи подряд (включая те, что появились по ходу).
  3. Затем берётся одна макрозадача, выполняется, и снова опустошается вся очередь микрозадач.
  4. Между этими шагами браузер при необходимости делает рендеринг.

Классический пример

console.log('1');
setTimeout(() => console.log('2'), 0);
Promise.resolve().then(() => console.log('3'));
console.log('4');
// Порядок: 1, 4, 3, 2

3 печатается раньше 2, потому что микрозадачи (Promise) обрабатываются раньше макрозадач (setTimeout), даже с задержкой 0.

Нюансы

  • Тяжёлая синхронная задача блокирует цикл: рендер и события «замерзают».
  • Бесконечная генерация микрозадач может «заморозить» страницу, не давая дойти до макрозадач и рендера.

Коротко для собеседования

Event Loop — цикл, который при пустом стеке сначала выполняет все микрозадачи (Promise), потом одну макрозадачу (setTimeout), и так по кругу. Это даёт асинхронность в одном потоке.

Подробнее: learn.javascript.ru — Event Loop, MDN — Event loop

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