Debounce dekorativ
debounce(f, ms)
dekorativ natijasi ms
milisoniyasiga maksimal bir marta chaqiruvni f
ga yetkazadigan o’rash bo’lishi kerak.
Boshqacha qilib aytganda, biz “debounced” funktsiyani chaqirganimizda, u eng yaqin ms
millisoniyalarda qolgan barcha kelajaklarga e’tibor berilmasligini kafolatlaydi.
Masalan:
Then if the wrapped function is called at 0ms, 200ms and 500ms, and then there are no calls, then the actual f
will be only called once, at 1500ms. That is: after the cooldown period of 1000ms from the last call.
f(1); // darhol ishlaydi f(2); // e’tiborsiz qoldirildi
setTimeout( () => f(3), 100); // e’tiborsiz qoldirildi (atigi 100 ms o’tdi) setTimeout( () => f(4), 1100); // ishlaydi setTimeout( () => f(5), 1500); // e’tiborsiz qoldirildi (oxirgi ishdan 1000 ms dan kam)
Amalda "debounce" bu qisqa vaqt ichida hech qanday yangi narsa qilinmasligini bilsak, biror narsani oladigan / yangilaydigan funktsiyalar uchun foydalidir, shuning uchun resurslarni sarf qilmaslik yaxshiroqdir.
function debounce(func, ms) {
let timeout;
return function () {
clearTimeout(timeout);
timeout = setTimeout(() => func.apply(this, arguments), ms);
};
}
debounce
ga chaqiruv o’ramni qaytaradi. Ikki variant bo’lishi mumkin:
isCooldown = false
– bajarilishga tayyor.isCooldown = true
– vaqt tugashini kutmoqda.
Birinchi chaqiruvda isCooldown
false
, shuning uchun chaqiruv davom etadi va holat true
ga o’zgaradi.
isCooldown
true
bo’lsa, boshqa barcha chaqiruvlar e’tiborga olinmaydi.
Keyin setTimeout
berilgan kechikishdan keyin uni false
ga qaytaradi.