Hodisalar sikli

JavaScript bir vaqtning o‘zida faqat bitta kod qismini bajarishi mumkin.

JavaScript band bo‘lganda boshqa JavaScript kodi kutishi kerak.

JavaScript taymerlar, foydalanuvchi bosishlari, yuklab olishlar va asinxron operatsiyalarni qanday boshqaradi?

Javob - Voqealar sikli.

ULASHISH

Hodisalar siklini (Event Loop) tushunish

Event Loop’ni tushunish JavaScript’ning ko‘plab odatiy xatti-harakatlarini tushuntirib beradi.

  • Why setTimeout(..., 0) does not execute immediately.
  • Nega uzun sikllar sahifani qotirib qo‘yadi.
  • Why Promises execute before timers.
  • Nega await brauzerni bloklamaydi.
  • Nega bosish hodisalari joriy kod tugashini kutadi.

JavaScript bir vaqtda bitta vazifani bajaradi

JavaScript kodni ketma-ket bajaradi.

Har qanday vaqtda faqat bitta funksiya bajarilishi mumkin.

Funksiyalar chaqirilgan tartibda bajariladi.

Har bir funksiya keyingisi boshlanishidan oldin tugashi kerak.

Misollar

function step1() {
  myDisplayer("Step 1");
}
function step2() {
  myDisplayer("Step 2");
}

step1();
step2();

Natija:

Step 1
Step 2

O‘zingiz sinab ko‘ring »

function step1() {
  myDisplayer("Step 1");
}
function step2() {
  myDisplayer("Step 2");
}

step2();
step1();

Natija:

Step 2
Step 1

O‘zingiz sinab ko‘ring »


Brauzer asinxron ishni bajaradi

JavaScript-ning o‘zi taymerlarni yoki veb-sahifalarni yuklab olishni kutmaydi.

Buning o‘rniga, JavaScript ishlashda davom etayotganda bu amallarni brauzer bajaradi.

Examples include:

  • Timers
  • Network requests
  • User events
  • File loading

Amaliyot tugagach, JavaScript natija tayyorligi haqida xabar oladi.


Hodisalar sikli (Event Loop)

Event Loop JavaScript band yoki band emasligini doimiy tekshirib turadi.

JavaScript joriy vazifasini tugatgandan so‘ng, Event Loop keyingi kutish vazifasini boshlaydi.

Ushbu jarayon sahifa ochiq bo‘lgunga qadar takrorlanadi.

JavaScript starts
↓

Run code
↓

Start timer
↓

Continue running
↓

Timer finishes
↓

Event Loop
↓

Run callback
Event Loop asinxron operatsiyalarni muvofiqlashtiradi va JavaScript keyingi vazifani qachon bajarishi kerakligini hal qiladi.

Misol: setTimeout()

Callback darhol amalga oshirilmaydi.

Buning o‘rniga, u JavaScript joriy ishini tugatguncha kutadi.

Misol

myDisplayer("A");

setTimeout(function() {
  myDisplayer("B");
}, 2000);

myDisplayer("C");

Natija:

A
C
B

O‘zingiz sinab ko‘ring »

Taymer deyarli darhol tugaydi.

Biroq JavaScript joriy kodni bajarib bo‘lmaguncha callback ishga tusha olmaydi.

Voqealar sikli joriy vazifa bajarilgandan so‘ng callback qilishni boshlaydi.


Misol: Promise

Misol

myDisplayer("A");

Promise.resolve().then(function() {
  myDisplayer("B");
});

myDisplayer("C");

Natija:

A
C
B

O‘zingiz sinab ko‘ring »

Nega Promise callback’i taymerdan oldin ishga tushdi?

Javob: Promise qilingan Callback-lar ustuvorligi yuqori bo‘lgan maxsus navbatga joylashtiriladi.


Vazifalar navbati va mikrovazifalar navbati

JavaScript asinxron ish uchun ikkita asosiy navbatdan foydalanadi.

Queue Contains
Task Queue Timers, events, messages
Microtask Queue Promise ishlovchilari va await

Har bir vazifa tugagandan so‘ng, JavaScript keyingi vazifani boshlashdan oldin barcha kutilayotgan mikrovazifalarni qayta ishlaydi.


Taymerlar va Promise’larni solishtirish

OperatsiyaQueue
setTimeout()Task Queue
setInterval()Task Queue
Click eventTask Queue
Promise.then()Microtask Queue
catch()Microtask Queue
finally()Microtask Queue
await continuationMicrotask Queue

Uzoq vazifalar JavaScript’ni bloklaydi

Agar JavaScript uzoq davom etadigan vazifani bajarsa, qolgan hamma narsa kutishi kerak.

Bu vaqt ichida brauzer boshqa JavaScript kodini bajara olmaydi.

Foydalanuvchi bosishlari, taymerlar va tugallangan yuklab olishlar joriy vazifa tugaguncha kutishi kerak.

Misol

wait() ishlayotgan vaqtda brauzer javob bermayapti.

function wait() {
  let i = 4e9;
  while (--i > 0);
}

myDisplayer("Start");
wait();
myDisplayer("Done");

O‘zingiz sinab ko‘ring »

Misol tahlili

Nega misol uzoq vaqt oldi?

Nima uchun "Boshlash" va "Bajarildi" bir vaqtning o‘zida ko‘rsatilgan?

Savollar to‘g‘ridan-to‘g‘ri brauzerlar sahifani qanday yangilashiga olib keladi.

Misol

Kod quyidagicha bajariladi:

myDisplayer("Start");
wait();
myDisplayer("Done");

1-qadam

Bu kod:

myDisplayer("Start");

DOM’ni o‘zgartiradi:

<p id="demo">Start</p>

Ammo brauzer darhol ekranni qayta bo‘yashmaydi.

2-qadam

starts the long loop.
wait();

Bu sikl ishlayotgan paytda:

  • JavaScript band
  • Event Loop ishlay olmaydi
  • Brauzer sahifani qayta chiza olmaydi

Shunday qilib, DOM allaqachon "Start" ni o‘z ichiga olgan bo‘lsa ham, foydalanuvchi hali ham uni ko‘rmaydi.

3-qadam

Nihoyat sikl tugaydi.

myDisplayer("Done");

Endi DOM quyidagicha bo‘ladi:

<p id="demo">Start Done</p>

4-qadam

JavaScript vazifasi tugadi.

Faqat endi brauzer sahifani qayta bo‘yash imkoniyatiga ega bo‘ladi.

Shunday qilib, foydalanuvchi quyidagini ko‘radi:

Start Done

Diplayed both at once.

Vaqt shkalasi

JavaScript starts
↓

myDisplayer("Start")
(DOM changes)
↓

wait()
(JavaScript busy)
↓

myDisplayer("Done")
(DOM changes again)
↓

JavaScript finishes
↓

Browser repaints
↓

Screen shows:
Start Done

Yuqoridagi misol yaxshi Event Loop misolidir.

Bu ikkita alohida narsa borligini ko‘rsatadi:

  • DOM’ni yangilash
  • Ekranni yangilash (rendering)

DOM darhol yangilanadi, lekin qayta bo‘yashdan oldin brauzer joriy JavaScript vazifasi tugashini kutishi kerak.


Avval "Start" ko‘rsatilishini xohlaysizmi?

Misol

Uzoq vazifani bajarishdan oldin brauzerga qayta bo‘yash imkoniyatini berishingiz kerak:

function wait() {
  let i = 4e9;
  while (--i > 0);
}

myDisplayer("Start");

setTimeout(function () {
  wait();
  myDisplayer("Done");
}, 0);

O‘zingiz sinab ko‘ring »

Vaqt shkalasi

JavaScript starts
↓

Display "Start"
↓

Current task finishes
↓

Browser repaints
(Start becomes visible)
↓

Event Loop
↓

Run wait()
↓

Display "Done"
↓

Browser repaints

Xulosa

  • JavaScript bir vaqtda bitta vazifani bajaradi.
  • Brauzer taymerlar, yuklab olishlar va foydalanuvchi hodisalari kabi asinxron operatsiyalarni bajaradi.
  • Tugallangan amallar JavaScript tayyor bo‘lguncha kutadi.
  • Voqealar davri joriy vazifa tugagach, kutish vazifalarini boshlaydi.
  • Promiselarni qayta ishlovchilar va await davomi taymerlardan oldin ishlaydi, chunki ular Microtask Queue-dan foydalanadilar.

Visualizer »



W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!