防抖和節(jié)流的概念其實最早并不是出現(xiàn)在軟件工程中,防抖是出現(xiàn)在電子元件中,節(jié)流出現(xiàn)在流體流動中
站在用戶的角度思考問題,與客戶深入溝通,找到久治網(wǎng)站設(shè)計與久治網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站制作、成都網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋久治地區(qū)。
但是很多前端開發(fā)者面對這兩個功能,有點摸不著頭腦:
a. 某些開發(fā)者根本無法區(qū)分防抖和節(jié)流有什么區(qū)別(面試經(jīng)常會被問到);
b. 某些開發(fā)者可以區(qū)分,但是不知道如何應(yīng)用;
c. 某些開發(fā)者會通過一些第三方庫來使用,但是不知道內(nèi)部原理,更不會編寫;
「在事件被觸發(fā)n秒后再執(zhí)行回調(diào),如果再這n秒內(nèi)又被觸發(fā),則重新計算」
? 輸入框中頻繁的輸入內(nèi)容,搜索或者提交信息;
? 頻繁的點擊按鈕,觸發(fā)某個事件;
? 監(jiān)聽瀏覽器滾動事件,完成某些特定操作;
? 用戶縮放瀏覽器的resize事件;
我們都遇到過這樣的場景,在某個搜索框中輸入自己想要搜索的內(nèi)容
比如想要搜索一個MacBook:
但是我們需要這么多次的網(wǎng)絡(luò)請求嗎?
這就是防抖的操作:只有在某個時間內(nèi),沒有再次觸發(fā)某個函數(shù)時,才真正的調(diào)用這個函數(shù);
我們通過一個搜索框來延遲防抖函數(shù)的實現(xiàn)過程:
p 監(jiān)聽input的輸入,通過打印模擬網(wǎng)絡(luò)請求
n 測試發(fā)現(xiàn)快速輸入一個macbook共發(fā)送了7次請求,顯示我們需要對它進(jìn)行防抖操作:
基本實現(xiàn)
立即執(zhí)行函數(shù)
增加取消功能
效果
規(guī)定在一個單位時間內(nèi),只能觸發(fā)一次函數(shù)。如果這個單位時間內(nèi)觸發(fā)多次函數(shù),只有一次生效
節(jié)流的實現(xiàn)過程
完善節(jié)流
:
key為按鍵,規(guī)定按下為低電平
if(key==0)
{
delay(50); //延時50ms,消抖
if(key==0) //再判斷是否按下
{
while(!key); 松手檢測
··················································
該按鍵按下要實現(xiàn)的功能程序
··················································
}
}
我的習(xí)慣是這樣寫
使用這個到板子里面:
#include reg52.h
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit KEY1 = P2^4;
sbit KEY2 = P2^5;
sbit KEY3 = P2^6;
sbit KEY4 = P2^7;
unsigned char code LedChar[] = { //數(shù)碼管顯示字符轉(zhuǎn)換表0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
void delay();
void main(){
bit keybuf = 1; //按鍵值暫存,臨時保存按鍵的掃描值
bit backup = 1; //按鍵值備份,保存前一次的掃描值
unsigned char cnt = 0; //按鍵計數(shù),記錄按鍵按下的次數(shù)
ENLED = 0; ?//選擇數(shù)碼管 DS1 進(jìn)行顯示
ADDR3 = 1;
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 0;
P2 = 0xF7; ?//P2.3 置 0,即 KeyOut1 輸出低電平
P0 = LedChar[cnt]; ?//顯示按鍵次數(shù)初值
while (1){
keybuf = KEY4; ?//把當(dāng)前掃描值暫存
if (keybuf != backup){ ?//當(dāng)前值與前次值不相等說明此時按鍵有動作
delay(); ?//延時大約 10ms
if (keybuf == KEY4){ ?//判斷掃描值有沒有發(fā)生改變,即按鍵抖動
if (backup == 0){ ?//如果前次值為 0,則說明當(dāng)前是彈起動作
cnt++; ?//按鍵次數(shù)+1
//只用 1 個數(shù)碼管顯示,所以加到 10 就清零重新開始
if (cnt = 10){
cnt = 0;
}
P0 = LedChar[cnt]; //計數(shù)值顯示到數(shù)碼管上
}
backup = keybuf; //更新備份為當(dāng)前值,以備進(jìn)行下次比較
}
}
}
}
/* 軟件延時函數(shù),延時約 10ms */
void delay(){
unsigned int i = 1000;
while (i--);
}