介绍
防抖和节流已经是前端程序员必须会的东西了,写这个主要是无聊了 ,然后想写写看
这两个概念很容易搞混(我之前也搞得不是很清楚),不过其本质都是为了减少请求次数,减少带宽。
防抖
防抖是指一定在事件触发 n 秒后才执行,如果在一个事件触发的 n 秒内又触发了这个事件,以新的事件的时间为准,n 秒后才执行,等触发事件 n 秒内不再触发事件才执行。
举个例子,csdn的搜索框,输入一些数据后就会自动补全,这个就是用了防抖实现。在输入结束后的0.6s左右发起请求并返回数据。
例子
let time=1000 //设定1000s后发起
let timeout=null
var Anti_shake=()=>{
//时间未到,清除上一个计时器
if(timeout) {return clearTimeout(timeout)}
//重新开始计时
timeout = setTimeout(async ()=>{
await Promise().resolve()
}, time);
}
我们也可以进行一个封装
function debounce(func, time) {
//定时器变量
var timeout;
return function () {
//每次触发scrolle,先清除定时器
clearTimeout(timeout);
//指定多少秒后触发事件操作handler
timeout = setTimeout(func, time);
};
};
节流
节流其实和防抖很像,但节流的意思是,一段时间内只能进行一次调用。
比如在1s中,我执行了多次函数,但我需要他1s内只执行一次
例子
var flag=true //设定是否ok
var time=1000 //设定时间为1s
const bind=()=>{
if(flag){
setTimeOut(async ()=>{
await Promise().resolve()
flag=true
},time)
flag=false
}
}
或者用时间
var lastTime=new Date()
var time=1000
const bind=()=>{
var nowTime=new Date()
if(nowTime - lastTime >=time){
(async ()=>{
await Promise().resolve()
})()
lastTime=nowTime
}
}
Q.E.D.