控制事件触发频率的两种策略:Debounce && Throttle

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了控制事件触发频率的两种策略:Debounce && Throttle相关的知识,希望对你有一定的参考价值。

参考技术A 在我们日常的开发中,以下几种情况会高频率的触发事件:

高频率的触发事件,会过度损耗页面性能,导致页面卡顿,页面抖动,尤其是当这些事件回调函数中包含ajax等异步操作的时候,多次触发会导致返回的内容结果顺序不一致,而导致得到的结果非最后一次触发事件对应的结果。

Debounce:一部电梯停在某一个楼层,当有一个人进来后,20秒后自动关门,这20秒的等待期间,又一个人按了电梯进来,这20秒又重新计算,直到电梯关门那一刻才算是响应了事件。

Throttle:好比一台自动的饮料机,按拿铁按钮,在出饮料的过程中,不管按多少这个按钮,都不会连续出饮料,中间按钮的响应会被忽略,必须要等这一杯的容量全部出完之后,再按拿铁按钮才会出下一杯。

这里我们使用 Lodash 库里面实现的debouce和throttle方法。
lodash支持自定义封装,使用下面两个命令封装一个我们自己的lodash库。

debounce调用方法: _.debounce(func, [wait=0], [options=]) 返回一个具有debounce策略的新函数。
throttle调用方法: _.throttle(func, [wait=0], [options=]) 返回一个具有throttle策略的新函数。

下面的例子是在移动端使用 rem 布局常用的一个函数,侦听 resize 事件改变根元素的 fontSize ,这种情况下适用debounce策略:

这个例子中,使用 throttle 策略,点击一次生成一行文字,1s中无论怎么点击,都只生成一行文字:

完整demo地址: demo

debounce.js
throttle.js

以上是关于控制事件触发频率的两种策略:Debounce && Throttle的主要内容,如果未能解决你的问题,请参考以下文章

js 中的截流函数throttle 和 debounce

防抖节流

防抖节流

javascript函数的节流[throttle]与防抖[debounce]

js 消抖(debounce)与节流(throttle)

防抖(debounce)和节流(throttle)