Sobes.tech
Middle+

Как работи цикълът на събитията (Event Loop) в Node.js?

sobes.tech AI

Отговор от AI

Event Loop — това е механизъм, който позволява на Node.js да изпълнява неблокиращи операции за входящи/изходящи операции, въпреки че JavaScript е еднопоточен език. Event Loop непрекъснато следи стека за извиквания, опашката за обратно повикване и различни опашки за събития (таймери, I/O).

Основните фази на Event Loop:

  1. timers: изпълнява планираните обратно повиквания с setTimeout() и setInterval().
  2. pending callbacks: изпълнява обратно повиквания на системни операции за вход/изход (например, мрежови грешки), отложени до следващата итерация на Event Loop.
  3. idle, prepare: вътрешни фази на Event Loop.
  4. poll:
    • изчислява колко дълго да блокира и да проверява операциите за вход/изход.
    • обработва събития в опашката за callback-и за I/O, когато техният брой достигне лимит или времето изтече.
  5. check: изпълнява обратно повиквания, планирани с setImmediate().
  6. close callbacks: изпълнява callback-и за затваряне, например socket.destroy().

process.nextTick() и микро задачи (обещания, queueMicrotask()) се изпълняват между фазите на Event Loop и преди преминаването към следващата фаза или завършването на текущата. process.nextTick() има по-висок приоритет от микро задачите.

// Примери за планиране на задачи
console.log('Начало');

setTimeout(() => {
  console.log('Таймер 0');
}, 0);

setImmediate(() => {
  console.log('setImmediate');
});

process.nextTick(() => {
  console.log('nextTick');
});

Promise.resolve().then(() => {
  console.log('Promise');
});

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

// Типичен ред на изпълнение (може да варира в зависимост от версията на Node.js и натоварването):
// Начало
// Край
// nextTick
// Promise
// Таймер 0  (ще се изпълни във фазата timers)
// setImmediate (ще се изпълни във фазата check)

Event Loop позволява на Node.js ефективно да обработва множество паралелни заявки без създаване на отделен поток за всяка, което осигурява висока производителност.