Sobes.tech
Middle+

Веб-API-деги окуялар циклі (event loop) кантип иштейт?

sobes.tech AI

AIден жооп

JavaScriptтеги окуялардын цикли (веб-браузердин контекстинде) — бул негизги агымды бөгөбөстөн асинхрондук операцияларды аткарууга мүмкүндүк берген механизм. Ал бир нече компоненттен турат:

  • Heap (Heap): Объекттер сакталуучу эс тутум аймагы.
  • Call Stack (Чалуу стек): LIFO алгоритми менен иштеген маалымат структурасы, синхрондук функцияларды көзөмөлдөйт.
  • Web API (Web APIлер): Браузер тарабынан камсыздалган (DOM, AJAX, setTimeout, setInterval, Event Listeners ж.б.). Алар JavaScript движогунун бөлүгү эмес.
  • Callback Queue (Калгандар кезеги): Асинхрондук тапшырмаларды аткаруу үчүн билдирүүлөр кезеги.
  • Microtask Queue (Микро-тапшырмалар кезеги): Приоритеттүү кезек (Promise.then(), async/await, queueMicrotask) жана ал тапшырмалар аткарылат алдында.
  • Event Loop (Окуялар цикли): Үзгүлтүксүз чалуу стекин жана кезекти текшерет. Эгер стек бош болсо, ал биринчи микро-тапшырманы стекке которот. Микро-тапшырмалар бүтсө, биринчи тапшырманы кезектен стекке которот.

Процесс мындай көрүнөт:

  1. Синхрондук код аткарылат жана функциялар чалуу стекине коюлат.
  2. Асинхрондук операция (мисалы, setTimeout) пайда болгондо, ал тиешелүү Web APIге берилет. Синхрондук код ишин улантат.
  3. Web API операцияны фондук режимде аткарат.
  4. Асинхрондук операция аяктагандан кийин, анын иштеткичи (callback) тапшырмалар кезегине (жалпы async операциялар үчүн) же микро-тапшырмаларга (промисстер үчүн) коюлат.
  5. Окуялар цикли үзгүлтүксүз чалуу стекин жана кезекти текшерет. Эгер стек бош болсо:
    • Микро-тапшырмалар кезегин текшерет. Эгер алда иштеткичтер болсо, аларды аткаруу үчүн стекке которот, микро-тапшырмалар бүтсө чейин.
    • Андан соң тапшырмалар кезегин текшерет. Эгер алда иштеткичтер болсо, биринчи иштеткичти стекке которот.
  6. Бул процесс кайра-кайра кайталанып, асинхрондук операцияларды негизги агымды бөгөбөстөн аткарууга мүмкүндүк берет.

Мисал менен setTimeout:

// Бул код чалуу стекинде аткарылат
console.log('Start');

// setTimeout - Web API. Callback 0мс өткөндөн кийин тапшырмалар кезегине коюлат.
// Чынжырдын иштеши кечигиши мүмкүн.
setTimeout(() => {
  console.log('Timeout');
}, 0);

// Бул код setTimeoutтөн кийин чалуу стекинде аткарылат
console.log('End');

// Натыйжа:
// Start
// End
// Timeout

Мисал менен промисстер:

// Чалуу стекинде аткарылат
console.log('A');

// promise. then() callback микро-тапшырмалар кезегине коюлат
Promise.resolve().then(() => {
  console.log('B');
});

// Чалуу стекинде аткарылат
console.log('C');

// Натыйжа:
// A
// C
// B

Ишке ашуу тартиби: синхрондук код ('A', 'C'), андан соң микро-тапшырмалар ('B'), андан соң тапшырмалар кезеги.