Middle
Pastāsti man par notikumu ciklu (event loop).
sobes.tech AI
Atbilde no AI
Notikumu cikls ir JavaScript asīnhronās darbības pamats. Tas pārvalda koda izpildi, notikumu apstrādi un mijiedarbību ar ārējo pasauli.
Galvenās sastāvdaļas:
- Heap (Heap): Atmiņas apgabals objektu piešķiršanai.
- Stack (Stack): Vieta, kur glabājas funkciju izpildes konteksti. Izsaucot funkciju, tā tiek ievietota stakā, bet pēc tās pabeigšanas — izņemta.
- Web API: Interfeisi, ko nodrošina pārlūkprogramma (DOM, AJAX, Timers utt.). Tie apstrādā asīnhronās operācijas.
- Callback Queue (Aicinājumu rinda): Ziņojumu rinda, kas saistīta ar notikumiem. Web API šeit ievieto pabeigtās asīnhronās operācijas aicinājumus.
- Notikumu cikls (Event Loop): Pastāvīgi uzrauga staku un aicinājumu rindu. Ja staka ir tukša, tas ņem pirmo aicinājumu no rindas un ievieto to stakā izpildei.
Process:
- Sinhronais kods tiek izpildīts stakā.
- Asīnhronās operācijas (piemēram,
setTimeout,fetch) tiek nodotas Web API. - Kad asīnhronā operācija ir pabeigta, tās aicinājums tiek ievietots aicinājumu rindā.
- Notikumu cikls gaida, kamēr staka kļūst tukša.
- Kad staka ir tukša, notikumu cikls ņem pirmo aicinājumu no rindas un ievieto to stakā, kur tas tiek izpildīts.
Piemērs ar setTimeout:
console.log('Start');
setTimeout(() => {
console.log('Inside setTimeout');
}, 0);
console.log('End');
Rezultāts būs:
Start
End
Inside setTimeout
Neskatoties uz 0 ms timeout, setTimeout aicinājums tiek izpildīts pēc sinhronā koda, jo tas nonāk rindā un gaida staka iztukšošanu.
Node.js notikumu cikls arī pastāv, bet ar dažādām fāzēm rindu apstrādē.