防抖和节流的概念其实最早并不是出现在软件工程中,防抖是出现在电子元件中,节流出现在流体流动中
站在用户的角度思考问题,与客户深入沟通,找到久治网站设计与久治网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站制作、成都网站设计、企业官网、英文网站、手机端网站、网站推广、域名注册、网络空间、企业邮箱。业务覆盖久治地区。
但是很多前端开发者面对这两个功能,有点摸不着头脑:
a. 某些开发者根本无法区分防抖和节流有什么区别(面试经常会被问到);
b. 某些开发者可以区分,但是不知道如何应用;
c. 某些开发者会通过一些第三方库来使用,但是不知道内部原理,更不会编写;
「在事件被触发n秒后再执行回调,如果再这n秒内又被触发,则重新计算」
Ø 输入框中频繁的输入内容,搜索或者提交信息;
Ø 频繁的点击按钮,触发某个事件;
Ø 监听浏览器滚动事件,完成某些特定操作;
Ø 用户缩放浏览器的resize事件;
我们都遇到过这样的场景,在某个搜索框中输入自己想要搜索的内容
比如想要搜索一个MacBook:
但是我们需要这么多次的网络请求吗?
这就是防抖的操作:只有在某个时间内,没有再次触发某个函数时,才真正的调用这个函数;
我们通过一个搜索框来延迟防抖函数的实现过程:
p 监听input的输入,通过打印模拟网络请求
n 测试发现快速输入一个macbook共发送了7次请求,显示我们需要对它进行防抖操作:
基本实现
立即执行函数
增加取消功能
效果
规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效
节流的实现过程
完善节流
:
key为按键,规定按下为低电平
if(key==0)
{
delay(50); //延时50ms,消抖
if(key==0) //再判断是否按下
{
while(!key); 松手检测
··················································
该按键按下要实现的功能程序
··················································
}
}
我的习惯是这样写
使用这个到板子里面:
#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[] = { //数码管显示字符转换表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; //按键计数,记录按键按下的次数
ENLED = 0; //选择数码管 DS1 进行显示
ADDR3 = 1;
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 0;
P2 = 0xF7; //P2.3 置 0,即 KeyOut1 输出低电平
P0 = LedChar[cnt]; //显示按键次数初值
while (1){
keybuf = KEY4; //把当前扫描值暂存
if (keybuf != backup){ //当前值与前次值不相等说明此时按键有动作
delay(); //延时大约 10ms
if (keybuf == KEY4){ //判断扫描值有没有发生改变,即按键抖动
if (backup == 0){ //如果前次值为 0,则说明当前是弹起动作
cnt++; //按键次数+1
//只用 1 个数码管显示,所以加到 10 就清零重新开始
if (cnt = 10){
cnt = 0;
}
P0 = LedChar[cnt]; //计数值显示到数码管上
}
backup = keybuf; //更新备份为当前值,以备进行下次比较
}
}
}
}
/* 软件延时函数,延时约 10ms */
void delay(){
unsigned int i = 1000;
while (i--);
}