JavaScript event loop va navbat tizimi
Nega setTimeout(..., 0) darhol bajarilmaydi? Nega Promise setTimeout dan
oldin chiqadi? Javob event loop da — JavaScript’ning ishlarni navbatga
qo’yish tizimida.
JavaScript bir oqimli
Unda setTimeout va fetch qanday “bir vaqtda” ishlaydi? Ularni JavaScript
emas, brauzer bajaradi va tayyor bo’lganda callback’ni navbatga qo’yadi.
Call stack
Call stack — bajarilayotgan funksiyalar to’plami. Har chaqiruv ustiga qo’shiladi, tugagach olinadi. Stack bo’shaguncha navbatdagi ish boshlanmaydi — bu asosiy qoida.
Ikki navbat
Tartib: sinxron kod → mikrotask → makrotask. setTimeout 0 ms bilan
yozilsa ham oxirida chiqdi.
Tartibni to’liq ko’rish
Qoida: butun sinxron kod → barcha mikrotasklar → bitta makrotask → yana barcha mikrotasklar → keyingi makrotask.
Zanjirdagi ikkinchi then ga e’tibor bering: u queueMicrotask dan
keyin chiqdi. Sababi — zanjirning har bo’g’ini o’zidan oldingisi
tugagachgina navbatga qo’yiladi, queueMicrotask esa allaqachon navbatda
turgan edi.
await ham mikrotask
async funksiya await gacha sinxron bajariladi. await dan keyingi
qism esa mikrotask navbatiga tushadi — async/await
Promise ustiga qurilgani shundan.
Mikrotask makrotaskni kutdirmaydi
Uchta mikrotask ketma-ket bajarildi — makrotask ularning hammasini kutdi.
Amaliy oqibat — og’ir hisobni bo’lish
Bunday hisobni bo’laklarga ajratib, orasida brauzerga navbat berish kerak:
Har bo’lak orasida setTimeout brauzerga hodisalarni qayta ishlash imkonini
beradi. Haqiqiy loyihalarda og’ir hisob uchun Web Worker ishlatiladi — u
alohida oqimda ishlaydi.
Xulosa jadvali
| Navbat | Nimalar | Qachon |
|---|---|---|
| Sinxron kod | Oddiy qatorlar | Darhol, stack’da |
| Mikrotask | then, catch, await, queueMicrotask |
Stack bo’shashi bilan, hammasi |
| Makrotask | setTimeout, setInterval, hodisalar |
Mikrotasklardan keyin, bittasi |
Amaliy mashq
console.log,setTimeout(0)vaPromise.thenni aralashtirib yozing — tartibni oldindan ayting, keyin tekshiring;asyncfunksiyadaawaitdan oldin va keyin log qo’ying;- uchta zanjirli
thenva bittasetTimeoutyozib, tartibni kuzating; whilebilan 500 ms bloklovchi kod yozing;- og’ir hisobni
setTimeoutbilan bo’laklarga ajrating; queueMicrotaskvasetTimeoutni solishtiring.
1-qadam — bu darsning asosiy sinovi.
Qisqacha xulosa
- JavaScript bir oqimli: bir vaqtda bitta ish bajaradi.
- Call stack bo’shamaguncha navbatdagi ish boshlanmaydi.
- Mikrotask (Promise, await) makrotaskdan oldin bajariladi.
- Har makrotaskdan keyin barcha mikrotasklar ishlaydi.
setTimeout(..., 0)“darhol” emas — “navbat kelganda” degani.- Og’ir sinxron kod sahifani muzlatadi — bo’laklang yoki Worker ishlating.
Keyingi darsda generator va iterator — qiymatlarni talab bo’yicha berish.