解谜RxJS操作符-过滤
/ / 点击当上游对象的吐出的数据,并不都是下游关心的,这时候就过滤操作符就派上用场了。
适用操作符 | 功能需求 |
---|---|
filter | 过滤掉不满足判定条件的数据 |
first | 获得满足判定条件的第一个数据 |
last | 获得满足判定条件的最后一个数据 |
take | 从数据流中选取最先出现的若干数据 |
所有的过滤类操作符都有判定函数参数,此外,有的过滤操作符还可以接受一个”结果选择器”(result selector)。
filter
过滤操作符,用法也比较简单,只能传判定函数
1 | const source$ = interval(1000) |
1 | const source$ = of(3,1,4,5,9) |
1 | const source$ = interval(1000).take(5) |
take
take意为”拿”,从上游Observable拿数据,参数决定需要拿多少。
1 | const source$ = interval(1000) |
takeUntil
在RxJS中,takeUntil是一个里程碑式的过滤操作符
它可以让我们用Observable对象来控制另一个Observable对象的数据
1 | const source$ = interval(1000) |
skip
跳过前N个之后全拿
1 | const source$ = interval(1000) |
回压控制
在RxJS的世界中,数据管道就像是现实世界的管道,数据就是现实中的液体或气体,如果数据管道中某一个环节处理数据的速度跟不上数据涌入的速度,又有无法把数据推送给下游,就会在缓冲区中挤压数据,这就相当于对上游施加了压力,这就是RxJS世界中的回压。
例如zip操作符就会产生
有损回压控制
回压这种现象的根源是数据管道中某个环节数据涌入的速度大于处理速度,
当处理不过来的时候,选择了舍弃掉一些涌入的数据,就叫有损回压控制
RxJS提供一系列操作符来实现有损回压控制
- throttle(Time)
- debounce
- audit(Time)
- sample(Time)
throttleTime
throttleTime可以意为”节流”1
2
3
4
5const source$ = interval(1000)
source$.pipe(
take(5),
throttleTime(2000)
)debounceTime
debounceTime可以意为”去抖动”1
2
3
4
5const source$ = interval(1000)
source$.pipe(
take(5),
debounceTime(2000)
)
如果没有take(5)是不会产生如何数据,因为debounce必须等上游不产生数据才开始工作auditTIme
audit意为”审计”,与throttle做的是类似的工作,throttle把第一个数据传给下游,audit是把最后一个数据传给下游。1
2
3
4
5const source$ = interval(1000)
source$.pipe(
take(5),
auditTime(2000)
)
小结
过滤操作符在RxJS中扮演很重要的角色,相当于交通警察,哪些数据可以通行,哪些不行都是通过过滤操作符。