1. 程式人生 > 實用技巧 >Lodash之throttle(節流)與debounce(防抖)總結

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。

throttleDemo走起(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請求事件。