【前端开发】防抖和节流

我不是一个前端开发程序员。之前有一个需求是用native代码来写一个ui程序。其中包括一个需求是:音量条。

音量条能够手动拖动来设置音量。也需要监听系统音量的变化,来改变 ui。一段时间后出现了一个bug,音量条在手动拖动一次后,会发生鬼畜的抖动。

分析后发现,是音量条会触发高频的音量变化事件,也就会高频的改变系统音量,然后系统数据库会高频的通知所有监听系统音量变化的应用。

问题在于高频之后,系统数据库的监听循环机制没有那么快。会导致音量改变事件在数据库监听机制这一层积压。最重会延后爆发,导致了音量的抖动。

处理机制很简单:加一个定时器降低设置频率即可。于是手动实现了类似的功能。我把它这种方式叫做:基于定时器的高频滤波机制。

最近才知道,这种操作在前端很常见,叫:防抖。主要应用在:事件发生频繁,但处理起来比较耗时的时候。例如上面的场景,以及监听鼠标的滚动事件、鼠标的位置改变事件等。
其处理办法就是:加一个定时器,在定时器到期之前再触发该事件时,取消上一个定时器,新建一个定时器。这个操作比较快,处理起来不会耗时。

可以使用如下函数来把事件处理函数封装成防抖函数


function debounce(func) {
	let time = null
	return () => {
	    clearTimeout(time)
	    time = setTimeout(() => {
	        func()
	    }, 500)
	}
}

还有一个类似的概念,叫做节流,主要应用在:防止用户高频触发某事件时。目的是让用户在一段时间内只能触发一次。

使用如下函数来把事件处理函数封装成节流函数


function throttle(fn) {
	let canRun = true;
	return function () {
	  if (!canRun) return;
	  canRun = false; 
	  setTimeout(() => {
	    fn();
	    canRun = true;
	  }, 500);
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值