Vaqt bilan ishlash taymerlari: setTimeout va clearTimeout, setInterval va clearInterval, interval tirbandligi xatari, rekursiv setTimeout yechimi hamda Debounce naqshi.
Bu bob bilan PART 4 (Asynchronous JavaScript) yakunlanadi. Chapter 26-29'da setTimeoutni ko'p marta misol sifatida ishlatgan edik — endi uni, va uning "aka-ukasi" setIntervalni to'liq va tizimli o'rganamiz.
setTimeout(function, delay) — berilgan delay (millisekundlarda) vaqtdan keyin, functionni bir marta ishga tushiradi.
script.jsJavaScriptconsole.log("Boshlanishi");setTimeout(function () {console.log("3 soniyadan keyin ishga tushdi");}, 3000);console.log("Bu darhol chiqadi");
script.jsJavaScriptlet timerId = setTimeout(function () {console.log("Bu hech qachon chiqmaydi");}, 5000);clearTimeout(timerId);
setTimeout — chaqirilganda bir noyob ID (timerId) qaytaradi. clearTimeout(timerId) — hali ishga tushmagan timerni bekor qiladi.
💡 Key Idea
clearTimeout — foydalanuvchi interfeysida juda foydali, masalan: "Agar foydalanuvchi 5 soniya ichida tugmani bossa, ogohlantirish ko'rsatilmasin" kabi holatlarda.
setInterval(function, interval) — berilgan interval millisekund oralig'ida, functionni cheksiz takrorlab ishga tushiradi (to'xtatilmaguncha).
script.jsJavaScriptlet count = 0;let intervalId = setInterval(function () {count++;console.log("Soniya: " + count);if (count === 5) {clearInterval(intervalId);console.log("To'xtatildi");}}, 1000);
Har 1 soniyada count oshadi va chiqariladi. count === 5 bo'lganda, clearInterval(intervalId) chaqirilib, takrorlanish to'xtatiladi.
⚠️ Common Mistake
setIntervalni to'xtatishni unutish — bu dasturda "xotira sizib chiqishi" (memory leak) va keraksiz fon jarayonlarining davom etishiga olib keladi. Har doim setInterval ishlatilganda, uni qachon va qanday to'xtatish haqida o'ylab qo'yish kerak.
Ko'p tajribali dasturchilar, ba'zi hollarda setInterval o'rniga ketma-ket setTimeout ishlatishni tavsiya qiladi. Buning sababini tushunish uchun ularning farqini chuqur ko'rish kerak.
setInterval — har doim, avvalgi chaqiruv tugaganmi yoki yo'qmi, buni tekshirmasdan, belgilangan vaqt oralig'ida yangi chaqiruvni "navbatga qo'yishga" harakat qiladi. Agar function bajarilishi belgilangan interval'dan uzoqroq vaqt olsa, chaqiruvlar "to'planib" qolishi yoki ustma-ust tushishi mumkin.
⏰ setIntervalni har 1 soniyada avtomatik yuboriladigan pochta jo'natmasiga o'xshating: agar oldingi jo'natma hali yetib bormagan bo'lsa ham, tizim baribir yangisini jo'nataveradi — bu "tirbandlik" yaratishi mumkin.
⏳ Ketma-ket setTimeout esa — "oldingi jo'natma yetib borgandan keyingina, keyingisini jo'natish" tamoyili bilan ishlaydi, bu ancha nazoratliroq.
script.jsJavaScriptfunction repeatTask() {console.log("Vazifa bajarildi: " + new Date().toLocaleTimeString());setTimeout(repeatTask, 1000); // faqat oldingi vazifa TUGAGACH, keyingisi rejalashtiriladi}setTimeout(repeatTask, 1000);
code.textTEXTsetInterval (xavfli bo'lishi mumkin):[vazifa1: 1200ms] [vazifa2 kutmoqda...] → tirbandlik│▼ interval = 1000ms, lekin vazifa 1200ms davom etadiRecursive setTimeout (xavfsizroq):[vazifa1: 1200ms] → tugagach → [1000ms kutish] → [vazifa2]
🔥 Important
Oddiy, qisqa vaqtli vazifalar uchun setInterval odatda yetarli va muammosiz. Lekin agar vazifa serverdan ma'lumot olish yoki boshqa noaniq davomiylikdagi amal bo'lsa, recursive setTimeout — xavfsizroq va tavsiya etiladigan yondashuv.
Debounce — foydalanuvchi tez-tez amal bajarganda (masalan, klaviaturada yozayotganda), functionni har safar emas, balki foydalanuvchi "to'xtagandan keyingina" bir marta ishga tushirish texnikasi. Bu — Chapter 44'da chuqur o'rganiladi, lekin setTimeout asosida qanday ishlashini shu yerda ko'rib chiqamiz.
script.jsJavaScriptlet timeoutId;function handleSearchInput(query) {clearTimeout(timeoutId);timeoutId = setTimeout(function () {console.log("Qidirilmoqda: " + query);}, 500);}// Foydalanuvchi tez-tez yozsa:handleSearchInput("J");handleSearchInput("Ja");handleSearchInput("Jav");// Faqat oxirgi chaqiruvdan 500ms o'tgach, "Qidirilmoqda: Jav" chiqadi
Har safar handleSearchInput chaqirilganda, avvalgi timer clearTimeout orqali bekor qilinadi, va yangi timer boshlanadi. Natijada, faqat foydalanuvchi yozishni to'xtatgandan keyin, oxirgi qiymat bilan qidiruv amalga oshadi.
🔗 Connection
Bu — clearTimeout + setTimeoutning eng amaliy va keng tarqalgan qo'llanilishlaridan biri, veb-dasturlashda juda ko'p ishlatiladi (qidiruv maydonlari, oyna o'lchamini o'zgartirish hodisalari va h.k.).
Task:
setTimeout yordamida 2 soniyadan keyin "Salom!" chiqaradigan kod yozing.
Required Concepts:
setTimeoutsetTimeout(() => console.log("Salom!"), 2000);Task:
setInterval yordamida har 1 soniyada 1 dan boshlab sonlarni chiqaring, 5ga yetganda avtomatik to'xtating (clearInterval bilan).
Required Concepts:
setInterval, clearIntervalTask:
Oddiy debounce(func, delay) nomli Higher-Order Function yozing — u istalgan functionni qabul qilib, uning "debounce qilingan" versiyasini qaytarsin (Chapter 30.4'dagi mantiqni umumiy function shakliga keltiring).
Required Concepts:
setTimeout, clearTimeoutscript.jsJavaScriptfunction debounce(func, delay) {let timeoutId;return function (...args) {clearTimeout(timeoutId);timeoutId = setTimeout(() => func(...args), delay);};}
script.jsJavaScriptfor (let i = 1; i <= 3; i++) {setTimeout(() => console.log(i), i * 1000);}console.log("Boshlandi");
🧠 Think first! Javobni ko'rishdan oldin kamida 30 soniya o'ylang.
<details> <summary>Answer</summary> Boshlandi 1 (1 soniyadan keyin) 2 (2 soniyadan keyin) 3 (3 soniyadan keyin)Why?
"Boshlandi" — sinxron kod, darhol chiqadi. Har bir setTimeout — turli kechikish vaqti bilan (1000, 2000, 3000ms) rejalashtirilgan, shuning uchun ular navbat bilan, belgilangan vaqtlarda chiqadi. let (Chapter 11) tufayli, har bir i o'zining alohida qiymatini to'g'ri "eslab qoladi".
Quyidagi kodda muammo bor — dasturchi "Yuklanmoqda..." xabarini 3 soniyaga ko'rsatib, keyin uni yashirmoqchi, lekin komponent 3 soniyadan oldin "yo'q qilinsa" (masalan, foydalanuvchi sahifani tark etsa), xatolik yuz beradi:
script.jsJavaScriptfunction showLoading() {console.log("Yuklanmoqda...");setTimeout(function () {console.log("Yuklandi!");}, 3000);}showLoading();// Foydalanuvchi 1 soniyadan keyin sahifani tark etadi,// lekin "Yuklandi!" baribir chiqadi — bu kerak emas edi
Your Task:
clearTimeoutdan foydalanib, timerni "bekor qilish" imkoniyatini qo'shing.Yechim:
</details>script.jsJavaScriptfunction showLoading() {console.log("Yuklanmoqda...");let timerId = setTimeout(function () {console.log("Yuklandi!");}, 3000);return timerId; // tashqariga qaytarilyapti, kerak bo'lsa bekor qilish uchun}let timer = showLoading();// Agar foydalanuvchi sahifani tark etsa:clearTimeout(timer); // "Yuklandi!" endi hech qachon chiqmaydi
setTimeout — functionni bir marta, belgilangan vaqtdan keyin ishga tushiradi.setInterval — functionni takrorlab, belgilangan interval bilan ishga tushiradi.clearTimeout/clearInterval — timerlarni bekor qilish uchun, timer ID orqali.setTimeout + clearTimeout orqali amalga oshiriladi.setInterval — albatta biror joyda clearInterval bilan to'xtatilishi kerak, aks holda "abadiy" ishlayveradi.setTimeout — setIntervaldan xavfsizroq.script.jsJavaScriptlet timeoutId = setTimeout(() => { }, 1000);clearTimeout(timeoutId);let intervalId = setInterval(() => { }, 1000);clearInterval(intervalId);function debounce(func, delay) {let timeoutId;return function (...args) {clearTimeout(timeoutId);timeoutId = setTimeout(() => func(...args), delay);};}
Mavzu bo‘yicha tushunchalaringizni interaktiv test orqali sinovdan o‘tkazing va natijalarni bilib oling.
Darslikda o‘rganilgan qoidalarga asosan real kod yozing, testlardan o‘tkazing va yechimlarni mustahkamlang.
Test Sinovi
Hali topshirilmagan (kamida 75% kerak)
Amaliy Masalalar
0 / 3 ta yechildi (kamida 75% kerak)
Dars sifati va mazmunini yaxshilash uchun o‘z haqqoniy bahoingizni qoldiring.
Mavzuni to‘liq o‘zlashtirish uchun test sinovi, amaliy kodlash va bog‘liq darslar
O‘z bilimingizni interaktiv test savollari orqali tekshiring va darhol xatolarni tahlil qiling.
Nazariyani real kod yozish bilan mustahkamlang, avtomatik testlardan o‘ting va XP to‘plang.
Kurs bo‘yicha keyingi va bog‘liq mavzular: