閒來無事在網上翻一些關於 Javascript 的一些搞基技巧,就發現了節流與防抖這兩種設計模式。

上個星期在編寫搜索框的時候就已經寫過類似的代碼 (搜索框輸入關鍵詞會實時去服務器上搜索,考慮到服務器壓力就把代碼加了限制,每 500ms 最多搜索一次,實際上這就是類似防抖的設計,只是我還不知道這個叫防抖…)

下面是搜索框的限制代碼:

1watch(searchText, (newVal) => {
2    clearTimeout(searchTimer);
3    searchTimer = setTimeout(
4        () => //...需要限制的邏輯
5            ),
6        500
7    );
8});

原理非常簡單,通過定時器實現,一旦現有狀態改變就說明有新的輸入,然後清除老的定時器,新設置定時器。


今天在網上衝浪又學到了一種新的設計:節流

直接看代碼吧:

 1watch(searchText, (newVal) => {
 2
 3    if(isStop) {
 4        return
 5    }
 6
 7    isStop = true;
 8
 9    setTimeout(
10        () => {
11            //...需要限制的邏輯
12            isStop = false
13        }
14    ),
15    500
16);

emmm,一開始看了半天,實際上看懂之後節流比防抖更加簡單 (好吧,看了幾遍其實發現差不多)

原理還是一樣簡單,計數器結束將標誌位設置為 false,這樣新來的計時器就能通過,如果沒到限制時間就進入這個函數會被標誌位攔住,直接返回。

節流主要作用就是限制執行頻率。

硬要說防抖和節流的區別。。。emm我也說不上來,看應用場景吧。