從JavaScript函數防抖,到嵌入式的軟件防抖,再到硬件上的硬件防抖引發的思考

從javascript應用的角度來說這叫函數防抖,其實從廣義的角度來說這屬於軟件防抖。防抖操作其實是基於業務操作來設計的,其實是一個很簡單的東西,卻很實用是真的。

防抖的業務場景是什麼?

用戶短時間內多次提交表單的操作

網絡原因,重複按提交按鈕

判斷scroll是否滑到底部等

爲什麼要防抖?

就是防止用戶短時間內做一些重複無效的操作,從而造成性能上不必要的負擔

 

我們來看業務場景,現在有一個提交按鈕,提交表單就將信息發送給服務器

<!DOCTYPE html>

<html>
    <head>
        
    </head>
    <body>

        <button type="button" onclick="fuck()" >這是一個按鈕</button>

            <script>
                

                function send(){
                    console.log('I have a message to server')
                }

                function fuck(){
                    send()
                }
                
       
            </script>

    </body>
</html>

現在我們點擊一個按鈕就有一個‘I have a message to server’,如果此時用戶網絡不好沒有及時跳轉頁面,就會重複提交多次一樣的信息,這是重複而多餘的信息。

現在我們可以這樣設置:

<!DOCTYPE html>

<html>
    <head>
        
    </head>
    <body>

        <button type="button" onclick="fuck()" >這是一個按鈕</button>

            <script>
                
                let handler = {
                    time:null,

                    send:function(){
                            console.log('I have a message to server')
                    },

                    do:function(){
                        //清除處理好的time,阻止之前的調用被執行
                        clearTimeout(this.time)

                            let self = this
                        this.time = setTimeout(function(){
                                self.send()
                        },3000)
                    }

                }

                function fuck(){
                    handler.do()
                }
                
       
            </script>

    </body>
</html>

爲了效果明顯我延遲了三秒,就是你在三秒內如何多次提交表單其實只會提交一次 

 這就是函數防抖的業務場景的應用了。其實不管我們這麼設計函數,我們的目的是用戶短時間內做一些重複無效的操作,從而造成性能上不必要的負擔。掌握這一點如何設計函數隨意發揮了

 

衍生到廣義的軟件防抖:
本人是做嵌入式出身的,其實在嵌入式領域也有防抖一說,這些是業務上的一些操作都是通用的。

切換到嵌入式開發的環境:

現在是一個電路板子,需要控制一個燈的亮滅。 其實就是把一個電平拉高拉低的操作。通常情況下我們是這樣做的:

void debounce(int btn){

    if(btn == 0)
    {

        sleep(100)

        if(btn == 0)
        {

        PIN_9 = 0
    
        }

    }


}

這是一個僞代碼,大致的意思是,當檢測到btn輸入信號爲拉低電平時,第一次確實btn是否爲0,確定後在延遲100毫秒,是爲了防抖(是否爲誤操作,或者按開關),然後才使管腳9拉低置0(此時可能是亮燈或者滅燈,要看看是否有反向輸出的操作)

 

其實不管是JS WEB上的防抖,還是嵌入式C語言上做的防抖,都屬於軟件防抖,硬件上也有防抖的操作,用了幾個電容做了邏輯電路(如果沒記錯的話)

從硬件到軟件上的來看,說明防抖操作是一脈相承的,很多的業務上也會做。雖然簡單,但是設計思想是一脈相承的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章