← Назад ко всем вопросам

Listener - это микро или макротаск

1️⃣ Как кратко ответить

Listener, или обработчик событий, выполняется в контексте макротаска. Когда событие происходит, его обработчик добавляется в очередь макротасков и выполняется после завершения текущего стека вызовов и всех микротасков.

2️⃣ Подробное объяснение темы

В JavaScript модель выполнения кода основана на концепции событийного цикла (event loop), который управляет очередями задач. Эти задачи делятся на макротаски и микротаски. Понимание различий между ними важно для эффективного управления асинхронным кодом.

Макротаски включают в себя такие операции, как:

  • Обработчики событий (listeners)
  • setTimeout
  • setInterval
  • setImmediate (в Node.js)
  • I/O операции

Микротаски включают:

  • Promise callbacks (then, catch, finally)
  • process.nextTick (в Node.js)
  • MutationObserver

Когда JavaScript движок завершает выполнение текущего стека вызовов, он сначала обрабатывает все микротаски, которые находятся в очереди. Только после этого он переходит к выполнению следующей макротаски.

Пример работы с обработчиком событий

Рассмотрим пример, чтобы понять, как обработчик событий (listener) работает в контексте макротасков:

console.log('Start');
​
setTimeout(() => {
  console.log('Timeout');
}, 0);
​
Promise.resolve().then(() => {
  console.log('Promise');
});
​
document.addEventListener('click', () => {
  console.log('Click event');
});
​
console.log('End');

Объяснение кода:

  1. console.log('Start'); — Синхронный код, выполняется сразу и выводит "Start".

  2. setTimeout(() => { console.log('Timeout'); }, 0); — Добавляет функцию в очередь макротасков, которая будет выполнена после всех микротасков и текущего стека вызовов.

  3. Promise.resolve().then(() => { console.log('Promise'); }); — Добавляет функцию в очередь микротасков, которая будет выполнена после завершения текущего стека вызовов.

  4. document.addEventListener('click', () => { console.log('Click event'); }); — Устанавливает обработчик события, который будет добавлен в очередь макротасков при возникновении события "click".

  5. console.log('End'); — Синхронный код, выполняется сразу и выводит "End".

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

  • Сначала выполняется весь синхронный код: "Start" и "End".
  • Затем выполняются все микротаски: "Promise".
  • После этого выполняется макротаск из setTimeout: "Timeout".
  • Обработчик события "click" будет выполнен как макротаск, когда произойдет событие "click".

Таким образом, обработчики событий (listeners) являются макротасками, и их выполнение происходит после всех микротасков и текущего стека вызовов. Это позволяет JavaScript эффективно управлять асинхронными операциями и обеспечивать плавное взаимодействие с пользователем.

Тема: JavaScript
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки