js实现 throttle 和 debounce,节流,防抖详解

2019-11-25 17:05:44

1、throttle 节流:drag改变浏览器大小,触发onresize函数,实现拖动每过1秒输出一次,不足1秒,1秒后输出一次。多用于高频操作,如抢票、抢购等,无论点击多少次,只固定间隔执行一次,以减轻压力。

原理: 设置canRun作为是否执行的标志。每次触发onresize,都判断canRun的值(true执行,false不执行)。第一次应该执行,所以设置canRun初始值为true。当第一次执行后,设置canRun为false(防止下次执行),并设置计时器,以恢复canRun的值。


var canRun = true;

window.onresize = function() {

  if (!canRun){

    return;

  }

  canRun = false;

  setTimeout(function() {

    console.log('节流了');

    canRun = true;

  }, 1000);

}

        好,原理有了,接下来我们封装一个随处可用的函数,"window"只是为了理解。可以删掉:


window.canRun = true;

window.throttle = function(callback, time) {

  if (!window.canRun) {

    return;

  }

  window.canRun = false;

  setTimeout(function() {

    callback();

    window.canRun = true;

  }, time);

}

// 这样使用:

window.onresize = function() {

  window.throttle(function() {

    console.log('防抖成功'); // 业务代码

  }, 1000);

    }

 


 


 


 

2、debounce防抖:drag改变浏览器大小,触发onresize函数,实现拖动停顿1秒输出。多用于输入框,当某一次输入后停顿满n秒才会去触发远程搜索。

        原理:timer作为定时器,每次触发onresize事件,都清一下定时器(之前未执行的drag方法就不会再执行),新的定时器在1秒后执行方法,那么如果下次drag在1秒内,这次赋值的定时器又会被清掉(搜索方法不会执行),直到下次drag相对于这次drag间隔时间大于1秒(定时器可能没那么准)再执行一次方法onresize。


var timer = false;

window.onresize = function() {

  console.log('1');

  clearTimeout(timer);

  timer = setTimeout(function() {

    console.log('防抖动');

  }, 1000);

    }

        同样,封装起来使用:


timer = false;

debounce = function(callback, time) {

  clearTimeout(timer);

  timer = setTimeout(callback, time);

}

onresize = function() {

  debounce(() => {console.log('不抖了');}, 1000);

    }

 



  • 2017-11-28 14:57:19

    vagrant up 失败解决办法

    直接使用VirtualBox开启一个vm也会失败,基本上可以确定是VirtualBox版本的问题 有遇到过安装了VirtualBox-5.0.22-108108-Win.exe的版本在win7下用不了,卸载重装VirtualBox-4.3.12-93733-Win.exe之后可用。

  • 2017-12-05 22:30:02

    php7.0升级php7.2

    看电脑上的教程要备份7.0配置文件以及扩展啥的,我感觉不如卸载干净重新安装

  • 2017-12-06 09:35:10

    分页优化的四种方式

    在大数据量的情况下,原本很简单的分页如果没有处理好,你会发现分页的请求会消耗你大量的数据库时间。如果你遇到了这个问题,文章给了你几个很好的解决的方案。当然,初学者若能看完这篇文章,那么它会指导你写出更具有扩展性的分页代码。