Sobes.tech
Middle

Papaskink apie įvykių ciklą (event loop).

sobes.tech AI

Atsakymas iš AI

Įvykių ciklas yra JavaScript asinchroninio darbo pagrindas. Jis valdo kodo vykdymą, įvykių apdorojimą ir sąveiką su išoriniu pasauliu.

Pagrindiniai komponentai:

  • Heap (Heap): Atminties sritis objektų paskyrimui.
  • Stack (Stack): Vietą, kur saugomi funkcijų vykdymo kontekstai. Kai kviečiama funkcija, ji įdedama į stack, o baigus ją, ji pašalinama.
  • Web API: Sąsajos, teikiamos naršyklės (DOM, AJAX, Timers ir kt.). Jos tvarko asinchronines operacijas.
  • Callback Queue (Kviečiančiųjų eilė): Žinučių eilė, susijusi su įvykiais. Web API čia deda užbaigtas asinchronines operacijas su callback.
  • Įvykių ciklas (Event Loop): Nuolat stebi stack ir callback eilę. Jei stack tuščias, paima pirmą callback iš eilės ir įdeda į stack vykdymui.

Procesas:

  1. Sinchroninis kodas vykdomas stack.
  2. Asinchroninės operacijos (setTimeout, fetch) siunčiamos į Web API.
  3. Kai asinchroninė operacija baigiasi, jos callback įdedamas į callback eilę.
  4. Įvykių ciklas laukia, kol stack taps tuščias.
  5. Kai stack tuščias, įvykų ciklas paima pirmą callback iš eilės ir įdeda į stack, kur jis vykdomas.

Pavyzdys su setTimeout:

console.log('Pradžia');

setTimeout(() => {
  console.log('setTimeout viduje');
}, 0);

console.log('Pabaiga');

Rezultatas:

Pradžia
Pabaiga
setTimeout viduje

Nors timeout yra 0 ms, setTimeout callbackas vykdomas po sinchroninio kodo, nes jis patenka į eilę ir laukia, kol stack bus ištuštintas.

Node.js taip pat turi įvykių ciklą, bet su tam tikrais skirtumais eilės apdorojimo fazėse.