当上游对象的吐出的数据,并不都是下游关心的,这时候就过滤操作符就派上用场了。

适用操作符 功能需求
filter 过滤掉不满足判定条件的数据
first 获得满足判定条件的第一个数据
last 获得满足判定条件的最后一个数据
take 从数据流中选取最先出现的若干数据

所有的过滤类操作符都有判定函数参数,此外,有的过滤操作符还可以接受一个”结果选择器”(result selector)。

filter

过滤操作符,用法也比较简单,只能传判定函数

1
2
const source$ = interval(1000)
source$.pipe(filter(x => x % 2 === 0))

0123456
0246

## first first可传可不传判定函数,不传就取上游Observable吐出数据的第一个。 并且还支持第三个参数,当没有匹配的数据,可以填入默认数据。
1
2
3
4
const source$ = of(3,1,4,5,9)
source$.first(
x => x < 0,
)
... 当没有值时,会返回EmptyError: no elements in sequence ## last last与first正好相反,过滤的事一个Observable中最后一个判定数据
1
2
const source$ = interval(1000).take(5)
source$.last(x > x % 2 === 0)
4

take

take意为”拿”,从上游Observable拿数据,参数决定需要拿多少。

1
2
const source$ = interval(1000)
source$.pipe(take(3))

012

takeUntil

在RxJS中,takeUntil是一个里程碑式的过滤操作符
它可以让我们用Observable对象来控制另一个Observable对象的数据

1
2
3
const source$ = interval(1000)
const notifier$ = timer(2500)
const takeUntil$ = takeUntil(notifier$)

01

skip

跳过前N个之后全拿

1
2
const source$ = interval(1000)
source$.pipe(take(5), skip(3))

34

回压控制

在RxJS的世界中,数据管道就像是现实世界的管道,数据就是现实中的液体或气体,如果数据管道中某一个环节处理数据的速度跟不上数据涌入的速度,又有无法把数据推送给下游,就会在缓冲区中挤压数据,这就相当于对上游施加了压力,这就是RxJS世界中的回压。
例如zip操作符就会产生

有损回压控制

回压这种现象的根源是数据管道中某个环节数据涌入的速度大于处理速度,
当处理不过来的时候,选择了舍弃掉一些涌入的数据,就叫有损回压控制
RxJS提供一系列操作符来实现有损回压控制

  • throttle(Time)
  • debounce
  • audit(Time)
  • sample(Time)

    throttleTime

    throttleTime可以意为”节流”
    1
    2
    3
    4
    5
    const source$ = interval(1000)
    source$.pipe(
    take(5),
    throttleTime(2000)
    )
    01234
    03

    debounceTime

    debounceTime可以意为”去抖动”
    1
    2
    3
    4
    5
    const source$ = interval(1000)
    source$.pipe(
    take(5),
    debounceTime(2000)
    )
    01234
    4
    如果没有take(5)是不会产生如何数据,因为debounce必须等上游不产生数据才开始工作

    auditTIme

    audit意为”审计”,与throttle做的是类似的工作,throttle把第一个数据传给下游,audit是把最后一个数据传给下游。
    1
    2
    3
    4
    5
    const source$ = interval(1000)
    source$.pipe(
    take(5),
    auditTime(2000)
    )
    01234origin
    03throttle
    2audit

小结

过滤操作符在RxJS中扮演很重要的角色,相当于交通警察,哪些数据可以通行,哪些不行都是通过过滤操作符。