throttle 和 debounce区别和用法

2020-12-01 16:36:47

参考地址 js实现 throttle 和 debounce

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

原理: 设置canRun作为是否执行的标志。每次触发onresize,都判断canRun的值(true执行,false不执行)。第一次应该执行,所以设置canRun初始值为true。当第一次执行后,设置canRunfalse(防止下次执行),并设置计时器,以恢复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秒后执行方法,那么如果下次drag1秒内,这次赋值的定时器又会被清掉(搜索方法不会执行),直到下次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);}

 


  • 2018-10-24 15:24:54

    getcachedir和getexternalcachedir的区别

    应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的。 大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中。 这样当该应用被卸载后,这些数据还保留在SDCard中,留下了垃圾数据。 如果你想让你的应用被卸载后,与该应用相关的数据也清除掉,该怎么办呢?

  • 2018-10-25 11:05:16

    SimpleDateFormat转换时间,12,24时间格式

    在使用SimpleDateFormat时格式化时间的 yyyy.MM.dd 为年月日而如果希望格式化时间为12小时制的,则使用hh:mm:ss 如果希望格式化时间为24小时制的,则使用HH:mm:ss