[Advanced Node JS] 1 — Петля событий

Цикл событий является одним из наиболее важных понятий в JavaScript(Browser) & Node JS.

Событийный цикл также является самым большим отличием от других классических языков программирования, таких как C/C++ или Java.

Node JS против Browser

Браузер и Node JS оба имеют свой собственный цикл событий. Node JS Event Loop немного сложнее и имеет больше фаз, но оба имеют одну и ту же концепцию. Я собираюсь представить вам цикл событий браузера.

Разница между циклом событий в Browser и Node JS

Синхронный вызов против асинхронного вызова

Синхронные вызовы поступают в стек, как и в других языках программирования. Они выполняются до тех пор, пока стек не опустеет.

Асинхронные вызовы попадают в очередь (Event Loop). Вот как выглядит Event Loop в простом коде:

while (queue.waitForMessage()) {
  queue.processNextMessage();
}
Вход в полноэкранный режим Выход из полноэкранного режима

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


// Synchronous Call
console.log("1: Pushed to stack");

// Asynchronous Call
setTimeout(()=>{
    console.log("1: Pushed to queue");
}, 1000);

// Synchronous Call
console.log("2: Pushed to stack");

// > Output: 
// 1: Pushed to stack
// 2: Pushed to stack
// 1: Pushed to queue
Вход в полноэкранный режим Выход из полноэкранного режима

Обработка функций продолжается до тех пор, пока стек снова не станет пустым. Затем цикл событий обрабатывает следующее сообщение в очереди (если оно есть). Каждое сообщение в очереди содержит функцию. Поэтому при опросе нового сообщения из очереди функция будет перемещена на вершину стека.

Мы хотим использовать очередь (Event Loop), когда на функцию приходится большая нагрузка. Обычно в веб-браузерах, когда мы вызываем какие-либо Web API, такие как setTimeout, eventListener, вызовы этих функций ставятся в очередь.

Оцените статью
devanswers.ru
Добавить комментарий