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

 


  • 2020-02-07 23:46:44

    You must call removeView() on the child's parent first解决办法

    出现这样的情况最多是发生在recyclerView中,holder复用的过程中,多次添加view,第一次添加的时候view有了父类了,可能就是复用引起的。 我是发生在给recyclerView添加广告view的时候发生的。

  • 2020-02-11 17:43:35

    基于VCamera,仿微信录制短视频

    vcamera.so这个确实挺好用,可定制性也挺高,但是确定也不小,需要引入的这个so包,10M啊。对于安装包苛刻的用户,这是致命啊。 我现在是抛弃他了。但是在这里还是记录一下用法吧。防止以后再用他。

  • 2020-02-13 13:37:53

    mysql随机排序

    首页热门栏目需要随机显示几条信息

  • 2020-02-14 20:08:17

    Android-应用被作为第三方浏览器打开

    微信里的文章页面,可以选择“在浏览器打开”。现在很多应用都内嵌了WebView,那是否可以使自己的应用作为第三方浏览器打开此文章呢?