Ana içeriğe geç

Yan yana

DebouncevsThrottling

Debounce ile throttle arasındaki fark nedir?

Güncellendi 2 dk okuma7 fark

Kısaca

Debounce, olay patlaması durana kadar bekler ve fonksiyonu bir kez çalıştırır; throttle ise olaylar sürerken onu aralık başına en fazla bir kez çalıştırır.

Debounce

Debounce, bir fonksiyonu art arda gelen olaylar belli bir süre durana dek ertelemektir; böylece arama kutusu her tuşta değil, yazma bitince istek gönderir.

Debounce sayfasını oku

Throttling

Throttling, bir fonksiyonu ne kadar sık çağrılırsa çağrılsın aralık başına en fazla bir kez çalıştırır; böylece kaydırma işleyicileri düzenli güncellenir.

Throttling sayfasını oku

Debounce ve Throttling karşılaştırması

ÖzellikDebounceThrottling
Ne zaman çalışırOlaylar bekleme süresi boyunca durduktan sonra bir kezOlaylar sürerken düzenli olarak, aralık başına en fazla bir kez
Uzun bir patlama boyuncaHiç çalışmazDüzenli bir hızda tekrar tekrar çalışır
İlk çalışmaAncak son olayı izleyen bekleme süresinden sonraHemen, ilk çağrıda
En uygun olduğu yerYazarken arama, otomatik kaydetme, doğrulama, yeniden boyutlandırmanın sonuKaydırma, sürükleme, ilerleme güncellemeleri, süren yeniden boyutlandırma
Tipik süre200 ila 500 ms bekleme50 ila 200 ms aralık ya da bir animasyon karesi
RiskBekleme çok uzunsa yavaş hissettirirSondaki son çağrı yoksa son durumu kaçırabilir
YardımcılarLodash ve benzeri kütüphanelerdeki debounceAynı kütüphanelerdeki throttle ya da requestAnimationFrame

Fark, açıklamalı

İkisi de aksi hâlde her tuş vuruşunda, her kaydırma adımında ya da her yeniden boyutlandırmada çalışacak fonksiyonları dizginler. Debounce her olayda bir zamanlayıcıyı yeniden başlatır ve fonksiyonu ancak olaylar bekleme süresinin tamamı boyunca, örneğin 300 milisaniye, sessiz kaldıktan sonra çalıştırır. Throttle ise fonksiyonu çalıştırır, ardından aralık dolana kadar gelen çağrıları yok sayar; böylece uzun bir patlama boyunca düzenli olarak, örneğin her 100 milisaniyede bir, çalışır.

Fark, kullanıcı devam ettiğinde ortaya çıkar. 300 ms'lik bir debounce ile on harfli bir arama yazmak son harften sonra tek bir istek gönderir; 300 ms'lik bir throttle ile ise kullanıcı hâlâ yazarken birkaç istek gider. Debounce edilmiş bir işleyiciyle üç saniye kaydırmak, kaydırma durana kadar hiçbir şeyi güncellemez; throttle edilmiş bir işleyici ise bütün süre boyunca düzenli güncelleme yapar.

Yani seçim, kullanıcının neyi görmesi gerektiğinden çıkar. Arama, otomatik kaydetme, form doğrulama ya da yeniden boyutlandırmadan sonra yerleşimi hesaplamak gibi yalnızca son değerin önemli olduğu durumlarda debounce kullanın. Sonsuz kaydırma, ilerleme çubuğu, küçülen bir başlık ya da sürükleme gibi ekranın eyleme yetişmesi gereken durumlarda throttle kullanın. Bazı yardımcılar ikisini birleştiren, en uzun bekleme süreli bir debounce sunar: bir duraklama bekler ama yine de belli aralıklarla çalışır.

İkisi de işi hızlandırmaz; yalnızca daha seyrek yapılmasını sağlar ve ikisi de bir miktar gecikme ekler. Animasyon için requestAnimationFrame çoğu zaman ikisinden de iyidir, çünkü ekranla uyumlu olarak kare başına bir kez çalışır.

Hangisini kullanmalısınız?

Debounce şu durumlarda doğru seçim:

  • Arama kutusu ya da otomatik kaydetme gibi yalnızca son değer önemli.
  • İş, bir ağ isteği gibi pahalı ve her duraklamada bir kez çalışmalı.
  • Eylem sırasında çalışmak, kullanıcının çoktan geçtiği sonuçları göstermek olur.

Throttling şu durumlarda doğru seçim:

  • Kullanıcı kaydırırken, yeniden boyutlandırırken ya da sürüklerken güncellemeleri görmeli.
  • Uzun ve sürekli bir eylem yine de düzenli olarak iş tetiklemeli.
  • İşin ne sıklıkla çalışacağına kesin bir üst sınır gerekiyor.

Debounce edilmiş bir arama kutusu ve throttle edilmiş bir kaydırma işleyicisi

Debouncejavascript
// Debounce: one request after the user stops typing
search.addEventListener("input", debounce((event) => {
  fetchResults(event.target.value);
}, 300));
Throttlingjavascript
// Throttle: check the position at most every 100 ms while scrolling
window.addEventListener("scroll", throttle(() => {
  header.classList.toggle("compact", window.scrollY > 80);
}, 100));

Sık sorulan sorular

Bir arama kutusu için hangisini kullanmalıyım?

Debounce. Kullanıcı en son ne yazdıysa onun sonuçlarını önemser; kısa bir duraklamadan sonra gönderilen tek bir istek de sunucuyu yarım yazılmış sözcükler için gelecek pek çok istekten kurtarır.

Kaydırma olayları için hangisini kullanmalıyım?

Throttle; ekranda bir şeyi güncelliyorsanız requestAnimationFrame. Debounce edilmiş bir kaydırma işleyicisi, kullanıcı kaydırmayı bırakana kadar hiçbir şey yapmaz.

İkisini birlikte kullanabilir miyim?

Evet. Bazı yardımcılar en uzun bekleme süreli bir debounce sunar: bir duraklama bekler, ama olaylar sınırdan uzun sürerse yine de çalışır. Bu, uzun düzenleme oturumlarında otomatik kaydetmeye uyar.

Daha fazla

Ayarlar