本文內容主要翻譯自issue 中國外大佬對防抖與節流的解釋, 后面補充了自己的理解和總結,
什么是防抖與節流
防抖和節流是處理“過于頻繁”發生的事情的常用技術,想象一下,你和朋友見面,朋友正在給你講一個故事,但他們說話時很難停下來,假設您想在可能的情況下不打斷他們滿足他們講故事的興致,同時還要回應他們所說的話, (我知道這可能有點做作,但請耐心等待!)
假設你們永遠不能同時說話,你有幾個策略:
同步
你可以在他們說完每句話時做出回應:

如果您的回復很短,這可能沒問題,但是,如果您的回答較長,這可能會使他們很難講完這個故事,所以這個策略不是很好,
防抖(Debounced)
你可以等他們停止說話,例如,如果他們停頓的時間足夠長,您就可以開始回應:

如果你的朋友偶爾會停下來,這個策略會很有效,但是,如果他們不停地說了幾分鐘,這根本不會讓你回應:

節流(Throttled)
您可以決定最多每分鐘回應一次,在這里,您可以計算自己有多久沒有說話了,一旦你一分鐘沒有說話,你就在朋友的下一句話之后插入你的回應:

如果您的朋友希望您在他們講故事時做出回應,但他們不會為您做這件事而制造停頓,則此策略會很有幫助,但是,如果他們中間停頓了一會,但您仍在無緣無故地等待,此時雙方都沒說話,那就尷尬了:

含義解釋
朋友的“句子”是按鈕點擊或鍵盤輸入等事件,您的“回應”正在更新螢屏,
當用戶做某事太快(例如打字)時,回應每個單獨事件更新螢屏太慢,因此,您可以使用防抖或節流,要么等待用戶停止輸入(防抖),要么每隔一段時間更新一次螢屏,比如每秒一次(節流),
補充舉例
游戲中:防抖就是 B 回城,以按下的最后一下為準,節流就是 QWER,按一下再按得等技能冷卻才能再按,
生活中:假設電梯有兩種運行策略 防抖和 節流,超時設定為 15 秒,不考慮容量限制,
電梯第一個人進來后,15 秒后準時運送一次,這是節流
電梯第一個人進來后,等待 15 秒,如果程序中又有人進來,15 秒等待重新計時,直到 15 秒后開始運送,這是防抖
編程中:搜索頁面,用戶連續輸入,等停下來再去觸發搜索介面,這是防抖,
美團后臺位置服務不能過于頻繁地呼叫后臺更新用戶位置,必須以特定頻率呼叫后端介面,這就是節流,
定義總結
防抖: n 秒后在執行該事件,若在 n 秒內被重復觸發,則重新計時,所以防抖是操作時不執行不操作時執行,
節流: 高頻事件觸發,但在 n 秒內只會執行一次,所以節流會稀釋函式的執行頻率,到時候了必須執行一次,
圖解說明

圖片來著Dart/Flutter 防抖與節流
為什么防抖有 trailing 模式和 leading 模式?
原因:您可能會發現防抖事件在觸發函式執行之前等待,直到事件停止如此迅速地發生,這讓您感到畝訓,(trailing edge 的情況),為什么不立即觸發函式執行,使其表現得與原始的未防抖處理程式完全一樣?于是就有了 leading edge 的情況,
如果覺得文章對你有幫助,點贊、收藏、關注、評論,一鍵四連支持,你的支持就是我創作最大的動力,
?? 本文原創聽蟬 公眾號:碼里特別有禪 歡迎關注原創技術文章第一時間推送 ??
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/544533.html
標籤:其他
