Lodash之throttle(節流)與debounce(防抖)總結


全手打原創,轉載請標明出處:https://www.cnblogs.com/dreamsqin/p/11305028.html

先重點說一下可能遇到的坑:主要在原本默認參數的設置以及兩個方法的選擇上,看完這篇總結你就知道怎么回事了~

 

throttle API走起

_.throttle(func, [wait=0], [options={}])

func (Function): 要節流的函數。

[wait=0] (number): 需要節流的毫秒數。

[options={}] (Object): 選項對象。

[options.leading=true] (boolean): 指定調用在節流開始前,默認true。

[options.trailing=true] (boolean): 指定調用在節流結束后,默認true。

 

throttle Demo走起(Vue寫法)

testThrottle: _.throttle(function() {
  console.log("throttle");
}, 5000, {
  leading: true,
  trailing: false
})

testThrottle方法被綁定在一個按鈕上,demo最終的效果是 :

1、按鈕點擊后控制台立馬打印了throttle——19:39:00;

2、5秒內點擊多次按鈕,最終只打印一次throttle——19:39:05前;

3、5秒后再點擊一次,會重新打印throttle——19:39:05后;

PS:lodash默認trailing為true,那么最終的效果是在點擊時會立即打印throttle,且5秒后又會再打印一次,即節流之前和之后都會執行該節流函數。

 

throttle 總結走起

預先設定一個執行周期,當調用動作的時刻大於等於執行周期則執行該動作,然后進入下一個新的時間周期。

簡言之:結束時間點不會隨點擊改變

 


 

debounce API走起

_.debounce(func, [wait=0], [options={}])

func (Function): 要防抖動的函數。

[wait=0] (number): 需要延遲的毫秒數。

[options={}] (Object): 選項對象。

[options.leading=false] (boolean): 指定在延遲開始前調用,默認false。

[options.maxWait] (number): 設置 func 允許被延遲的最大值。

[options.trailing=true] (boolean): 指定在延遲結束后調用,默認true。

 

debounce Demo走起

testDebounce: _.debounce(function() {
  console.log("debounce");
}, 2000, {
  leading: true,
  trailing: false
})

 

testDebounce方法被綁定在一個按鈕上,demo最終的效果是 :

1、按鈕點擊后控制台立馬打印了debounce——19:39:00;

2、5秒內點擊多次按鈕,最終只打印一次debounce——19:39:05前,假設19:39:04完成了最后一次點擊;

3、相對於最后一次點擊的5秒后再點擊一次,會重新打印debounce——19:39:09后;

PS:lodash默認leading為false、trailing為true,那么最終的效果是在點擊后等待5秒才會打印debounce,即延遲之前不執行函數,而是在延遲之后執行。

 

debounce 總結走起

當調用動作觸發一段時間后,才會執行該動作,若在這段時間間隔內又調用此動作則將重新計算時間間隔。

簡言之:結束時間點會隨點擊改變

 


 

綜上所述,適用情況如下:

throttle

(1)對於鍵盤事件,當用戶鍵入非常頻繁,但我們又必須要在一定時間(閥值)內執行處理函數的時候。例如:一些網頁游戲的鍵盤事件。

(2)對於鼠標移動和窗口滾動,鼠標的移動和窗口的滾動會帶來大量的事件,但是在一段時間內又必須看到頁面的效果。例如:對於可以拖動的div,如果使用debounce,那么div會在拖動停止后突然跳到目標位置;這時就需要使用throttle。

 

debounce

(1)對於鍵盤事件,當用戶輸入比較頻繁的時候,可以通過debounce合並鍵盤事件處理。例如:需要在用戶輸入完成時進行字符串校驗。

(2)對於ajax請求的情況。例如:當頁面下拉超過一定范圍就通過ajax請求新的頁面內容,這時候可以通過debounce合並ajax請求事件。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM