防抖與節流:教你傾聽時插話的技巧

碼裡特別有禪發表於2023-02-20

本文內容主要翻譯自issue 中國外大佬對防抖與節流的解釋, 後面補充了自己的理解和總結。

什麼是防抖與節流

防抖和節流是處理“過於頻繁”發生的事情的常用技術。想象一下,你和朋友見面,朋友正在給你講一個故事,但他們說話時很難停下來。假設您想在可能的情況下不打斷他們滿足他們講故事的興致,同時還要回應他們所說的話。 (我知道這可能有點做作,但請耐心等待!)

假設你們永遠不能同時說話。你有幾個策略:

同步

你可以在他們說完每句話時做出回應:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/08f295b7e32a467e94da9071c1a63262~tplv-k3u1fbpfcp-zoom-1.image

如果您的回覆很短,這可能沒問題。但是,如果您的回答較長,這可能會使他們很難講完這個故事。所以這個策略不是很好。

防抖(Debounced

你可以等他們停止說話。例如,如果他們停頓的時間足夠長,您就可以開始回應:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/51573c40cc444895b6696844358771a9~tplv-k3u1fbpfcp-zoom-1.image

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

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/60b3648f278f42458077e37066f32bd8~tplv-k3u1fbpfcp-zoom-1.image

節流(Throttled

您可以決定最多每分鐘響應一次。在這裡,您可以計算自己有多久沒有說話了。一旦你一分鐘沒有說話,你就在朋友的下一句話之後插入你的回應:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/82a76ff9575d4440b7481f1867b2435d~tplv-k3u1fbpfcp-zoom-1.image

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

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/192fcaf36da64d0a9a1d189d2dfbc5e9~tplv-k3u1fbpfcp-zoom-1.image

含義解釋

朋友的“句子”是按鈕點選或鍵盤輸入等事件。您的“回應”正在更新螢幕。

當使用者做某事太快(例如打字)時,響應每個單獨事件更新螢幕太慢。因此,您可以使用防抖或節流,要麼等待使用者停止輸入(防抖),要麼每隔一段時間更新一次螢幕,比如每秒一次(節流)。

補充舉例

遊戲中:防抖就是 B 回城,以按下的最後一下為準。節流就是 QWER,按一下再按得等技能冷卻才能再按。

生活中:假設電梯有兩種執行策略 防抖和 節流,超時設定為 15 秒,不考慮容量限制。

電梯第一個人進來後,15 秒後準時運送一次,這是節流

電梯第一個人進來後,等待 15 秒。如果過程中又有人進來,15 秒等待重新計時,直到 15 秒後開始運送,這是防抖

程式設計中:搜尋頁面,使用者連續輸入,等停下來再去觸發搜尋介面,這是防抖。

美團後臺位置服務不能過於頻繁地呼叫後臺更新使用者位置,必須以特定頻率呼叫後端介面,這就是節流。

定義總結

防抖: n 秒後在執行該事件,若在 n 秒內被重複觸發,則重新計時,所以防抖是操作時不執行不操作時執行。

節流: 高頻事件觸發,但在 n 秒內只會執行一次,所以節流會稀釋函式的執行頻率,到時候了必須執行一次。

圖解說明

Untitled.png

圖片來著Dart/Flutter 防抖與節流

為什麼防抖有 trailing 模式和 leading 模式?

原因:您可能會發現防抖事件在觸發函式執行之前等待,直到事件停止如此迅速地發生,這讓您感到惱火。(trailing edge 的情況),為什麼不立即觸發函式執行,使其表現得與原始的未防抖處理程式完全一樣?於是就有了 leading edge 的情況。

如果覺得文章對你有幫助,點贊、收藏、關注、評論,一鍵四連支援,你的支援就是我創作最大的動力。

❤️ 本文原創聽蟬 公眾號:碼裡特別有禪 歡迎關注原創技術文章第一時間推送 ❤️

相關文章