Sobes.tech
Middle

Разкажи ми за цикъла на събитията (event loop).

sobes.tech AI

Отговор от AI

Цикълът на събитията е основата на асинхронната работа в JavaScript. Той управлява изпълнението на кода, обработката на събития и взаимодействието с външния свят.

Основни компоненти:

  • Heap (Куча): Област от памет за разпределяне на обекти.
  • Stack (Стек): Място, където се съхраняват контекстите на изпълнение на функциите. При извикване на функция тя се поставя в стека, а при завършване — се премахва.
  • Web API: Интерфейси, предоставени от браузъра (DOM, AJAX, Timers и др.). Те обработват асинхронните операции.
  • Callback Queue (Опашка за обратни повиквания): Опашка от съобщения, свързани със събития. Web API поставят тук обратните повиквания на завършените асинхронни операции.
  • Цикъл на събитията (Event Loop): Постоянно следи стека и опашката за обратни повиквания. Ако стекът е празен, взема първото обратното повикване от опашката и го поставя в стека за изпълнение.

Процес:

  1. Синхронният код се изпълнява в стека.
  2. Асинхронните операции (setTimeout, fetch) се изпращат към Web API.
  3. Когато асинхронната операция приключи, нейното обратното повикване се поставя в опашката за обратни повиквания.
  4. Цикълът на събитията чака, докато стекът стане празен.
  5. Когато стекът е празен, цикълът взема първото обратното повикване от опашката и го поставя в стека, където се изпълнява.

Пример с setTimeout:

console.log('Начало');

setTimeout(() => {
  console.log('Вътре в setTimeout');
}, 0);

console.log('Край');

Изходът ще бъде:

Начало
Край
Вътре в setTimeout

Въпреки таймаута от 0 мс, обратното повикване на setTimeout се изпълнява след синхронния код, защото попада в опашката и чака изпразването на стека.

В Node.js също съществува цикъл на събития, но с някои разлики във фазите на обработка на опашките.