Цикл подій JavaScript Асинхронне виконання без блокування

Цикл подій JavaScript керує асинхронними операціями, виконуючи зворотні виклики з черги, коли стек викликів порожній, запобігаючи блокуванню потоку.

The event loop is a fundamental process in JavaScript's runtime environments (browsers, Node.js) that enables non-blocking asynchronous behavior. Since JavaScript is single-threaded, it can execute only one operation at a time. Without the event loop, long-running tasks (e.g., network requests, timers) would halt the main thread, leading to an unresponsive application. The event loop operates alongside the call stack, browser Web APIs (or Node.js APIs), and a task queue (or callback queue). When an asynchronous task is initiated, it's delegated to the appropriate API. Upon completion, its associated callback function is placed in the task queue. The event loop continuously checks if the call stack is clear. If it is, it dequeues the oldest callback from the task queue and pushes it onto the call stack for execution. This cycle ensures that asynchronous operations are handled efficiently without blocking the primary thread.

        graph LR
  Center["Цикл подій JavaScript Асинхронне виконання без блокування"]:::main
  classDef main fill:#7c3aed,stroke:#8b5cf6,stroke-width:2px,color:white,font-weight:bold,rx:5,ry:5;
  classDef pre fill:#0f172a,stroke:#3b82f6,color:#94a3b8,rx:5,ry:5;
  classDef child fill:#0f172a,stroke:#10b981,color:#94a3b8,rx:5,ry:5;
  classDef related fill:#0f172a,stroke:#8b5cf6,stroke-dasharray: 5 5,color:#94a3b8,rx:5,ry:5;
  linkStyle default stroke:#4b5563,stroke-width:2px;

      

🧒 Простими словами

Уявіть [JavaScript](/uk/terms/javascript) як кухаря, який може робити лише одну справу одночасно. Якщо йому потрібно спекти торт (довге завдання), він не буде просто стояти і чекати. Він ставить торт у духовку і встановлює таймер, а потім відразу починає готувати салат (інше завдання). Коли дзвенить таймер духовки, кухар закінчує салат, дістає торт і переходить до наступного. Цикл подій схожий на систему кухаря для керування цими 'очікуючими' завданнями, гарантуючи, що вони будуть оброблені, коли будуть готові, не зупиняючи іншу роботу.

🤓 Expert Deep Dive

Цикл подій JavaScript — це модель паралелізму, яка керує виконанням коду, завдань та подій. Він постійно відстежує стек викликів та черги завдань. Синхронний код виконується безпосередньо у стеку викликів. Асинхронні операції (наприклад, setTimeout, Promises, I/O) передаються API середовища хоста, які керують їх виконанням. Після завершення асинхронної операції її зворотний виклик (або обробник виконання Promise) поміщається у відповідну чергу — чергу завдань (для макрозавдань, таких як setTimeout, DOM-події) або чергу мікрозавдань (для мікрозавдань, таких як Promises, queueMicrotask). Основна функція циклу подій полягає в тому, щоб, коли стек викликів порожній, витягувати завдання та виконувати їх. Мікрозавдання зазвичай обробляються перед макрозавданнями. Зокрема, після завершення поточного макрозавдання і перед початком наступного, цикл подій виконає всі доступні мікрозавдання. Це надає пріоритет негайним зворотним викликам (як-от вирішення Promise) над відкладеними, забезпечуючи швидкість відгуку та ефективне оброблення асинхронних операцій у різних середовищах JavaScript.

📚 Джерела