Sobes.tech
Middle+

Veb-API-də hadisə döngüsü (event loop) necə işləyir?

sobes.tech Süni İntellekt

AI-dan cavab

JavaScript-də hadisələr döngüsü (veb brauzer kontekstində) əsas icra axını bloklamadan asinxron əməliyyatları yerinə yetirməyə imkan verən mexanizmdir. O, bir neçə komponentdən ibarətdir:

  • Heap (Heap): Ob'ektlərin saxlanıldığı yaddaş sahəsi.
  • Call Stack (Çağrı yığını): LIFO məlumat strukturu, sinxron funksiyaların icrasını izləyir.
  • Web APIs: Brauzer tərəfindən təmin edilir (DOM, AJAX, setTimeout, setInterval, Event Listeners və s.). Onlar JavaScript mühərrikinin bir hissəsi deyildir.
  • Callback Queue (Callback növbəsi) / Task Queue (Tapşırıq növbəsi): Asinxron tapşırıqları yerinə yetirmək üçün mesajlar növbəsi.
  • Microtask Queue (Mikro tapşırıq növbəsi): Prioritetli mikro tapşırıqlar üçün növbə (Promise.then(), async/await, queueMicrotask). O, tapşırıq növbəsindən əvvəl icra olunur.
  • Event Loop (Hadisələr döngüsü): Davamlı olaraq çağrı yığını və növbəni yoxlayır. Əgər yığın boşdursa, mikro tapşırıq növbəsinin ilk handlerini yığına köçürür. Mikro tapşırıq növbəsi boşaldıqdan sonra, ilk handlerini tapşırıq növbəsindən yığına köçürür.

Proses belə işləyir:

  1. Sinxron kod icra olunur və funksiyalar çağrı yığınına yerləşdirilir.
  2. Asinxron əməliyyat (məsələn, setTimeout) ilə rastlaşdıqda, o müvafiq Web API-ya ötürülür. Sinxron kod icrası davam edir.
  3. Web API əməliyyatı fon rejimində yerinə yetirir.
  4. Asinxron əməliyyat tamamlandıqda, onun handler (callback) bu əməliyyatın tapşırıq növbəsinə (adi async əməliyyatlar üçün) və ya mikro tapşırıq növbəsinə (promeslər üçün) yerləşdirilir.
  5. Hadisələr döngüsü davamlı olaraq çağrı yığını yoxlayır. Əgər boşdursa:
    • Mikro tapşırıq növbəsini yoxlayır. Əgər handlerlər varsa, onları icra üçün çağrı yığınına köçürür, mikro tapşırıq növbəsi boşalana qədər.
    • Sonra tapşırıq növbəsini yoxlayır. Əgər handlerlər varsa, ilkini çağrı yığınına köçürür.
  6. Bu proses təkrarlanır, əsas axını bloklamadan asinxron əməliyyatların yerinə yetirilməsinə imkan verir.

setTimeout ilə nümunə:

// Bu kod çağrı yığında icra olunur
console.log('Start');

// setTimeout - Web API. Callback 0ms sonra tapşırıq növbəsinə əlavə olunur.
// Əsl icra hadisələr döngüsü tərəfindən gecikdirilə bilər.
setTimeout(() => {
  console.log('Timeout');
}, 0);

// Bu kod setTimeout-dan sonra çağrı yığında icra olunur
console.log('End');

// Nəticə:
// Start
// End
// Timeout

Promise ilə nümunə:

// Çağrı yığında icra olunur
console.log('A');

// Promise. then() callback mikro tapşırıq növbəsinə əlavə olunur
Promise.resolve().then(() => {
  console.log('B');
});

// Çağrı yığında icra olunur
console.log('C');

// Nəticə:
// A
// C
// B