在实现交互功能的前端开发中,往往需要对于事件进行处理,控制事件的触发频率。这时候,节流与防抖方案就成了比较常见的解决方案。在 RxJS 中也有相应的实现。
节流与防抖的概念
节流
节流的含义是,控制函数的调用频率。例如,在进行实时搜索时,输入框的内容往往会变化很多,如果每次输入框的内容改变都去发送一次搜索请求,会导致服务器压力过大,并且用户体验也很差。这时候就需要使用节流。
比如,我们希望在用户输入时,每隔 500ms 内只执行一次搜索,这样既能保证用户体验,也能减少服务器压力。那么在 RxJS 中,我们可以使用 throttleTime 操作符来实现。
防抖
防抖的含义是,控制函数的执行频率。防抖解决的场景类似于输入框的验证等。通常情况下,我们会在输入框中监听 oninput 事件,当用户输入时立即进行验证。但是用户快速输入会导致频繁的验证,这样既浪费资源也影响用户体验。防抖的作用是限制函数的频繁调用。
比如,我们希望在用户输入过程中,每次输入之后等待 500ms,如果用户在等待时间内输入了新的内容,则重新计时,直到用户停止输入才进行验证。那么在 RxJS 中,我们可以使用 debounceTime 操作符来实现。
节流与防抖的实现
节流的实现
在 RxJS 中,我们可以使用 throttleTime 操作符来实现节流。throttleTime 的使用方式为:
source$.pipe( throttleTime(durationMs) );
其中,durationMs 是一个数字,代表了事件执行的最少间隔时间(以毫秒为单位)。例如,如果 durationMs 为 500,则代表每隔 500ms 执行一次源 Observable 订阅函数。
-- -------------------- ---- ------- ------ - --------- - ---- ------- ------ - ------------ - ---- ----------------- ----- --- - --------------------------------- ----- ---- - -------------- --------- ---------- ----------------- - ------------- -- ------------------ ---------
在这里,我们监听了一个 button 的 click 事件,在点击之后每隔 500ms 执行一次订阅函数。这样既保证了用户的体验,也控制了触发事件的频率。
防抖的实现
在 RxJS 中,我们可以使用 debounceTime 操作符来实现防抖。debounceTime 的使用方式为:
source$.pipe( debounceTime(durationMs) );
其中,durationMs 是一个数字,代表了等待时间(以毫秒为单位)。例如,如果 durationMs 为 500,则代表等待 500ms 执行源 Observable 订阅函数。
-- -------------------- ---- ------- ------ - --------- - ---- ------- ------ - ------------ - ---- ----------------- ----- -------- - -------------------------------- ----- ------ - ------------------- --------- ------------ ----------------- - ------------- -- ------------------ ---------
在这里,我们监听了一个 input 的 input 事件,在等待 500ms 之后执行订阅函数。这样既限制了事件的触发频率,也提高了用户的体验。
节流与防抖的对比
节流与防抖的场景有所不同,两者常常被混淆。对于节流,它的作用在于限制事件的触发频率,比如我们要进一步控制事件的执行频率以达到优化程序性能或提高用户体验的目的。而在防抖方案中,它的作用在于限制函数的调用频率,触发时刻是固定的,只不过在一段时间内,不断刷新该函数的调用时间而已,以避免无效并频繁的用户行为而造成的过多的开销。
相比于 setTimeout 方案,RxJS 节流与防抖方案的优点在于,它是基于 Observable 的,而不是基于回调函数的。使用 RxJS,我们不仅能够轻松地转换普通事件成 Observable,而且还能够利用了 RxJS 丰富的操作符控制事件流的方方面面。
总结
节流和防抖是常见于实现交互功能的两个工具。它们主要的作用在于,控制事件的触发和调用频率。在 RxJS 中,我们可以使用 throttleTime 和 debounceTime 操作符来实现节流和防抖功能。建议在开发中按需使用,以达到优化程序性能和提高用户体验的目的。
示例代码:
-- -------------------- ---- ------- ------ - --------- - ---- ------- ------ - ------------- ------------ - ---- ----------------- ----- --- - --------------------------------- ----- ---- - -------------- --------- ---------- ----------------- - ------------- -- ------------------ --------- ----- -------- - -------------------------------- ----- ------ - ------------------- --------- ------------ ----------------- - ------------- -- ------------------ ---------
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64a8baee48841e989451d6f4