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

JavaScript

Unda setTimeout va fetch qanday “bir vaqtda” ishlaydi? Ularni JavaScript emas, brauzer bajaradi va tayyor bo’lganda callback’ni navbatga qo’yadi.

Call stack

JavaScript

Call stack — bajarilayotgan funksiyalar to’plami. Har chaqiruv ustiga qo’shiladi, tugagach olinadi. Stack bo’shaguncha navbatdagi ish boshlanmaydi — bu asosiy qoida.

Ikki navbat

JavaScript

Tartib: sinxron kod → mikrotask → makrotask. setTimeout 0 ms bilan yozilsa ham oxirida chiqdi.

Tartibni to’liq ko’rish

JavaScript

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

JavaScript

async funksiya await gacha sinxron bajariladi. await dan keyingi qism esa mikrotask navbatiga tushadi — async/await Promise ustiga qurilgani shundan.

Mikrotask makrotaskni kutdirmaydi

JavaScript

Uchta mikrotask ketma-ket bajarildi — makrotask ularning hammasini kutdi.

Amaliy oqibat — og’ir hisobni bo’lish

JavaScript

Bunday hisobni bo’laklarga ajratib, orasida brauzerga navbat berish kerak:

JavaScript

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

  1. console.log, setTimeout(0) va Promise.then ni aralashtirib yozing — tartibni oldindan ayting, keyin tekshiring;
  2. async funksiyada await dan oldin va keyin log qo’ying;
  3. uchta zanjirli then va bitta setTimeout yozib, tartibni kuzating;
  4. while bilan 500 ms bloklovchi kod yozing;
  5. og’ir hisobni setTimeout bilan bo’laklarga ajrating;
  6. queueMicrotask va setTimeout ni 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.

Bu dars foydali bo'ldimi?

marta ko'rildi