防抖与节流

71 阅读1分钟
  • 函数防抖:用户频繁触发某个行为的时候,我们只识别一次(频率的定义可以自己管控)
  • 函数节流:当用户频繁操作的时候,不根据用户的操作 度来触发多少次,而是根据设定好的频率进行触发,实现降频效果,相对于防抖来讲,节流是允许触发多次;

场景一:点击按钮,向服务器发送请求(需要一定的时间),在当请求没有成功之前,再次点击按钮应该什么都不处理才对

  • submit是提交按钮
  • this.$apt.postInfo()向服务器发送请求,而account和paaword是要向服务器传递的数据
let isRun = false;
submit.onclick = async function(){
    if(isRun){
        //如果处于请求中,就不要再去做任何事情
        return;
    }
    isRun = true//正在请求中
    await this.$api.postInfo({
        account:`zju`;
        password:`1111111`;
    });
    //第一次发送的请求成功了:把isRun的值回归位false
    isRun = false;
}

防抖手写

const submit = document.querySelector(`#submit`);
const func = function func(){
    console.log(ok);
};//要实现的

//假设只要300ms内触发超过两次,就识别为频繁操作,最后把要做的事情只做一遍
let timer = null;
submit.onclick = function (){
    clearTimeout(timer);//清除上一次设置的定时器
    //在重新设置一个新的定时器来监听:300ms内是否触发两次
    // +有的话则把之前设置的定时器清除掉在设置一个即可
    // +没有的话到时间把想要执行的执行即可
    timer = setTimeout(() =>{
        func();
    },300);
};

submit.onclick = utils.debounce(func,300);//第一个参数是要实现的东西,第二个参数是定时器事件
(function (){
    //函数的防抖与节流
    const debounce = function debounce(func,wait){
        let timer = null;
        return function opearte(){
            //疯狂点击多次,opearte就会被执行多少次,但是我们的目的是让func(真正要处理的函数)执行一次即可
            clearInterval(timer);
            timer = setTimeout(() =>{
                func();
            },wati)
        }
    }
})