JS函数防抖

138 阅读2分钟

「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战

前言

实际项目中,我们可能会遇到这种需求,在输入框输入文字时,当停止输入的时候就要发起请求,这样就会有一个问题,每当我们输入完一个字符时就会发起一个请求,那么输入一百个文字就会发起一百次请求,服务器的压力就会特别的大,虽然后端肯定会做一些减压措施,比如负载均衡,但是我们前端也需要做些措施来防范这种问题;那么我们要怎么来解决这个问题呢?——这里可以使用“防抖”技术。

防抖

防抖,每当触发事件后,在一段特定的时间内只能执行一次,若是在特定的时间还会再次触发事件,那么就删除上一次事件,特定时间重新计算。
比如我们在上班搭乘电梯,电梯等待是10秒钟;现在甲打开电梯进去,电梯等待10秒钟,刚关上还没上去,乙打开电梯,电梯会再等待10秒钟,即每次有人进去都会再次等待10秒钟(网上偷偷看到大神们举的例子)。每次触发事件都会重新计算等待时间。

代码实现

function debounce(fn, delay=500) {
    let timeId = null;
    return function() {
        if(timeId) clearTimeout(timeId);
        timeId = setTimeout(() => {
            fn.apply(this, arguments);
        }, delay)
    }
}

如上代码所示,预先声明一个timeId,先判断timeId是否已经被赋值了,若是有,则证明已经有事件触发过了,则需要把旧事件清除掉,若是没有被赋值则继续往下执行,设置一个setTimeout事件,赋值给timeId;若是再次触发事件,就按上次的顺序再走一遍(重点:清除旧事件,赋值新事件,再执行传进来的函数事件)。

用途

  • input输入完成时要执行搜索任务(输入完一个字母或者文字就要发起请求)
  • 缩放windows窗口,触发resize属性执行实时改变页面样式,则可以阻止多次执行事件
  • 拉动windows窗口滚动条或者向下滚动时,触发scroll属性向服务器发送请求,则可以阻止多次执行事件