加强版的throttle

Posted HeiYanjing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加强版的throttle相关的知识,希望对你有一定的参考价值。

节流
trottle:在某段时间内,不管你触发了多少次回调,我都只认第一次,并在计时
结束时给予响应。所谓的“节流”,是通过在一段时间内无视后来产生的回调请求来实现的.
防抖
debounce:在某段时间内,不管你触发了多少次回调,我都只认最后一次。时间到了就执行回调。

存在的问题:
debounce 太有耐心了。如果用户的操作十分频繁,他每次都不等debounce 设置的 delay 时间结束就进行下一次操作,于是每次 debounce 都为该用户重新生成定时器,回调函数被延迟了不计其数次。频繁的延迟会导致用户迟迟得不到响应,用户同样会产
生“这个页面卡死了”的观感。
希望的结果:
如果delay 时间内,我可以为你重新生成定时器;但只要delay的时间到了,我必须
要给用户一个响应。

throttle(fn,delay){
   let last =0;  // 上⼀次触发回调的时间
   let timer = null; 
   return ()=>{
      let context = this;
      let args = arguments;
      let pre = Date.now();
      // 判断上次触发的时间和本次触发的时间差是否⼩于时间间隔的阈值
      if(now -pre < delay){
       //  如果时间间隔⼩于我们设定的时间间隔阈值,则为本次触发操作设⽴⼀个新的定时器
         clearTimeout(timer);
         timer  = setTimeout(()=>{
              last = now;
              fn.apply(context,args);
         },delay);
      }else{
      // 如果时间间隔超出了我们设定的时间间隔阈值,那就不等了,⽆论如何要反馈给⽤户⼀次响应
         last = now;
         fn.apply(context,args);
      }
   }
}

const myscroll = throttle(()=>{console.log(\'scroll\')},1000);

以上是关于加强版的throttle的主要内容,如果未能解决你的问题,请参考以下文章

自定义View——加强版的EditText

P3796 模板AC自动机(加强版)

使用pyinotify实现加强版的linux tail -f 命令,并且对日志类型的文本进行单独优化着色显示。

订阅Unity Plus加强版,三重好礼等待您!

android面试题总结加强再加强版

节流函数-throttle