Agular 中的 RxJS 之 节流防抖

1,789 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

前言

上一篇文章中我们介绍了许多的操作符,能够对 数据流 的数据进行操作,今天会补充几个操作符或者辅助方法,主要是为了之后用可观察对象进行实践来铺垫一些基础方法,其中比较重要的,就是节流以及防抖方法。

节流和防抖我们在之前已经介绍过它的原理了,并且在 rxjs 中也帮我们封装好了很方便使用的节流防抖函数,接下来就来看看是怎么去使用的。

节流操作符 throttleTime

节流,可观察对象高频次向外部发出数据流,通过 throttleTime 限制在规定时间内每次只向订阅者传递一次数据流

image.png

在之前的文章当中,我们已经介绍过了节流的一个概念并且实现过一个简单的节流函数。那么在 rxjs 中提供给了我们方便的操作符来实现节流,我们可以将其用在点击事件上面,用于对多次的点击事件流出的数据做一个节流。

import { fromEvent } from "rxjs";
import { throttleTime } from "rxjs/operators";

let button = document.getElementById("button");

fromEvent(button, "click")
  .pipe(throttleTime(2000))
  .subscribe((e) => console.log(e));

image.png

这样哪怕在短时间内多次点击按钮,也只会流出一个数据,这对于浏览器或者系统的性能优化有着很大的作用,在一些会多次触发的场景但是又没有必要一直传递数据,就可以使用节流操作符,在规定时间内只会流出一次数据。

防抖操作符 debounceTime

防抖,可观察对象高频次向外部发出数据流,通过 debounceTime 限制高频发出将会刷新,只有在规定时间内未发出才会响应最后一次

image.png

在之前也介绍过关于防抖的一个概念,我们同样同事件流出的数据来进行一个模拟。

import { fromEvent } from "rxjs";
import { throttleTime } from "rxjs/operators";

let button = document.getElementById("button");

fromEvent(button, "click")
  .pipe(debounceTime(2000))
  .subscribe((e) => console.log(e));

image.png

在点击按钮需要等待两秒才会流出数据,这就是一个事件的防抖。

操作符 distinctUntilChanged

检测数据源当前发出的数据流是否和上次发出的相同,相同的话就不会再次发出而会直接跳过,只有不相同才会再一次发出。

image.png

distinctUntilChanged 操作符能够检测当前数据流流出的数据和上一次的是否相同,这样在一些场景中可以避免相同数据的多次累赘发送。我们可以用之前使用过的 from 辅助方法来试验一下,将一个 [1,2,2,3] 的数组转为可观察对象并且订阅发布,按照上面的说法,结果就不会有第三个 2 这个数据。

import { fromEvent, from } from "rxjs";
import { distinctUntilChanged } from "rxjs/operators";

from([1, 2, 2, 3])
  .pipe(distinctUntilChanged())
  .subscribe((e) => console.log(e));

image.png

可以看到,浏览器中的输出少了一个 2,这就是这个函数成功的拦截了相同的两份数据的第二次发送。

总结

本文我们补充了三个操作符,这三个操作符是在日常的一些开发中会比较经常使用到的,当然也包括我们接下去要举的一些实际的例子,也会需要用到这些操作符,所以在这里先做一个介绍,比较方便之后实例中进行一个 简单 实践的开发。