JS节流

86 阅读2分钟

「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战
上一篇介绍了防抖,这次就把它的好基友“节流”也顺便说下。

前言

实际生活中,大部分人都会在网上买东西,特别是双十一的时候网上东西打折什么的,吸引一大堆人疯狂购物;这时候服务器容量就那么大,接收到的请求往往比平时超出很多,瞬间感觉压力山大。有时网络不好点击没反应就一直点点点,死命点,然后就发送了n次请求给服务器的压力就更大了,所以这时候就需要做减压。后端需要做减压,前端也需要适当的做一些,“节流”就是其中的一种方法。

节流

在一段特定的时间内只能执行一次。举个例子,有时响应社区的要求下去排队做核酸(假如护士小姐姐给一个人采样需要10秒钟),在特定时间内(10秒)给一个人采样后才能给下一个人继续采样,不能说让一个人坐下去张开嘴巴后还没采样就让他回去排队,叫后面的人前来采样;排队的时候必须一个做完再做后一个。

代码实现

function jieliu(fn, time) {
    let pre = Date.now();
    return function(){
        let now = Date.now();
        if( now - pre > time){
            fn.apply(this,arguments);
            pre = Date.now();
        }
    }
}

上面例子采用时间戳方式实现节流,调用函数时(假如我传入的等待时间为10秒),先获取第一时间点,再获取第二时间点,第二时间减去第一时间的差大于10秒(记得时间单位要转换)时就可以再次执行我们的请求动作,否则就不让它进去。

用途

  • 拉动windows窗口滚动条或者向下滚动时,触发scroll属性向服务器发送请求,则可以阻止多次执行事件
  • 防止用户短时间内多次点击提交按钮