前端日常——节流

2019-10-22  本文已影响0人  CCCCCccccccch

一、什么是节流

当持续触发事件时,在规定时间段内只调用一次回调函数。如果在规定时间内又触发了该事件,则什么都不做,也不重置定时器。

与防抖相比较:

防抖是将多次执行变为最后一次执行,节流是将多次执行变为在规定时间内只执行一次。一般不会重置定时器,即不会if(timer) clearTimeout(timer);(时间戳+定时器版除外)

二、应用场景

两个条件:

1、用户连续频繁地(事件触发的时间间隔比规定的时间要短)触发事件

2、用户不只关心“最后一次”操作后的结果反馈,而是在操作过程中的持续反馈。

如:鼠标不断点击触发,点击事件在规定时间内只触发一次(单位时间内只触发一次);监听滚动事件,比如是否滑到底部加载更多,用throttle来判断。

三、原理

两种实现方式:

1、时间戳方式:通过闭包保存上一次的时间戳,然后与事件触发的时间戳比较,如果大于规定时间,则执行回调,否则就不作处理。特点:一般第一次会立即执行,之后连续频繁地触发事件,也是超过了规定时间才会执行一次。最后一次触发事件,也不会执行(因为如果你最后一次触发时间大于规定时间,这样就算不上连续触发了)。

2、定时器方式:原理与防抖类似,通过闭包保存上一次定时器状态,然后事件触发时,如果定时器为null(即代表此时间隔时间已经大于规定时间),则设置新的定时器,到时间后执行回调函数,并将定时器设置为null。特点:当第一次触发事件时,不会立即执行函数,到了规定时间后才会执行,之后连续频繁地触发事件,也是到了规定时间才会执行一次(因为定时器)。当最后一次停止触发后,由于定时器的延时,还会执行一次回调函数(是上一次成功触发执行的回调,而不是你最后一次触发产生的)。一句话总结就是延时回调,你能看到的回调都是上次成功触发产生的,而不是你此刻触发产生的。

这两种最大的区别是:时间戳版的函数触发是在规定时间开始的时候,而定时器的函数触发是在规定时间结束的时候。

四、代码实现

1、时间戳版:

2、定时器版:

3、时间戳+定时器版(实现第一次触发可以立即响应,结束触发也能有响应,该版才最符合实际工作要求)

上一篇 下一篇

猜你喜欢

热点阅读