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);

    }

 



  • 2019-01-29 14:50:51

    Node.js 编写跨平台 spawn 语句

    Node.js 是跨平台的,也就是说它能运行在 Windows、OSX 和 Linux 平台上。很多 Node.js 开发者都是在 OSX 上做开发的,然后再将代码部署到 Linux 服务器上。由于 OSX 和 Linux 都是基于 Unix 的,因此两者共性很多。Windows 也是 Node.js 官方支持的平台,只要你通过正确的方式写代码,就能在各个平台上毫无压力的跑起来。

  • 2019-01-30 17:53:21

    视图与临时表

    视图与表的不同之处:视图是一个虚表,即视图所对应的数据不进行实际存储,数据库只存储视图的定义,对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表。

  • 2019-02-01 08:43:59

    JS 随机排序算法

    使用JS编写一个方法 让数组中的元素每次刷新随机排列

  • 2019-02-12 16:36:23

    图片工具GraphicsMagick的安装配置与基本使用

    GraphicsMagick是一个短小精悍的的图片处理工具和库集合。对于Java开发者来说,常用的图片处理工具有3个,JDK自带的图片处理库,ImageMagick,GraphicsMagick。JDK自带的图片处理库,虽稳定简单,性能却比较差;ImageMagick是目前最流行的图片处理工具,它的功能非常丰富;GraphicsMagick的功能略逊于ImageMagick,但是它的效率更强悍,但大多数情况下,GM的功能已经足够使用了。