RxJS

  • redux-observable: https://github.com/redux-observable/redux-observable
  • rxjs-hooks: https://github.com/LeetCode-OpenSource/rxjs-hooks
  • observable-hooks(推荐): https://github.com/crimx/observable-hooks

Subject是一个同时具有Observable和Observer特性的类,
用于创建可以同时被生产者和消费者使用的Hot Observable对象.

Subject的一种变体, 会暂存Subject的最新值,
这使得下游的订阅者总是能在订阅后立即得到一个值.

类似于BehaviorSubject, 可以设定缓冲区大小, 或基于时间进行缓存.

Subject的一种变体, 只在到达complete状态时将最后一个值发给下游.

依序连接几个上游Observable, 只有前一个Observable完结时, 下一个Observable才会开始.

一般意义上的合并, 所有上游Observable同时开始, 先到先得.

只有当所有上游Observable完结时, merge生成的Observable才会完结.

把每个上游Observable的每次生成的数据合并进一个数组, 然后向下游发送这个数组,
生成数组的时间点取决于生成数据频率最低的上游.

任何一个上游Observable完结, 都会导致zip生成的Observable完结.
如果已完结的上游Observable生成数据的频率较高, 在zip还未生成全部下游数据的情况下就已完结,
则zip会先将下游数据依序生成完, 然后才完结.

如果上游Observable生成数据的频率不同, 则生成速度较快的上游的数据会在内存里积压, 等待其他上游.

行为类似于zip, 同样是合并上游数据向下游发送数组, 但在接收到第一组数据之后,
就不再会等待所有上游生成, 而是在任意上游生成数据时就生成下一组数据:
combineLatest会记忆每个上游的最新(latest)数据, 向下游发送的是包含最新数据的数组.
因此下游收到的数组可能会重复包含某些上游的相同数据, 因为这些上游还没有生成新的数据.

combineLatest的机制有一个缺陷, 即上游2个Observable同时生成数据时, 总是会产生两个下游数据.

行为类似于combineLatest, 但只有第一个上游Observable发出数据才会导致生成下游数据.
用withLatestFrom可以弥补combineLatest对同时生成的多个上游数据生成多组下游数据的缺陷.

只有在除了第一个Observable以外的所有上游都准备好数据后,
第一个上游新发出的数据才会触发withLatestFrom向下游发送数组.
也就是说, 在其他上游准备好之前, 即使第一个Observable发出很多次数据, 也不会触发下游生成.

多个上游Observable相互竞争, 第一个发出数据的上游会被订阅并传给下游, 其他上游被退订,
后续行为跟竞争胜出的上游完全相同.

总是先发出startWith的数据, 然后再发出其他数据, 即使startWith位于管道靠后的位置也是如此.

只会发出一个数据, 即所有Observable完结时的数据合并而成的数组.
名称来自于经典的并行计算模型fork-join.
功能相当于流版本的 Promise.all.

发出时间窗口内的第一个数据, 发出数据的时间点是时间窗口内第一个数据出现的时候.

时间窗口的计时是从第一个数据发出时开始的, 空闲时不会开启时间窗口.
所以不会出现"上游发出两个数据, 第一个数据的时间点位于周期末尾, 导致向下游连续发出两个事件"的情况.

行为类似于throttle, 但发出的是时间窗口内的最后一个数据, 并且发出数据的时间点是时间窗口的末尾.

时间窗口的计时跟throttle一样, 也是当第一个数据发出时开始,
空闲时不会开启时间窗口.

sample类似于audit, 但采用与上游无关的固定时间间隔作为时间窗口.
每次到达时间窗口的末尾, 就会取上游在这个时间窗口内发出的最后一个数据发给下游.
如果上游在此时间窗口内没有产生数据, 则sample也不产生数据.

收到上游数据后, 只有在一段时间内没有收到任何上游新数据时, 才会将上游的最后一个数据发给下游.

只向下游发出之前没出现过的上游数据, 为了存储上游数据来确认唯一性, 该操作符可能会占用大量内存.

当上游连续发出相同数据时, 只向下游发出这连续相同数据中的第一个数据, 该操作符只存储上游的最后一个数据.

行为类似于distinctUntilChanged, 只不过判断数据重复性的标准是上游发出的数据对象的特定key的值.

完全忽视上游数据, 只接收complete或error.

把上游发出的数据视作数组, 只获取第一个参数指定的下标的数据.
如果直到上游完结也没有出现对应下标的数据, 则采用第二个参数作为默认值.

给定一个条件, 如果上游直到完结时只有一个满足条件的数据, 返回这个数据, 否则抛出error.

基于时间的缓存, 会缓存一段时间窗口内的上游数据.
时间窗口结束后将上游数据打包成数组发给下游.

基于时间的缓存, 会缓存一段时间窗口内的上游数据.
时间窗口开始时向下游发送一个新的Observable,
之后该时间窗口内的上游数据都会被发送至该Observable,
缓存多少内容取决于Observable什么时候被订阅.

根据数据个数进行缓存, 在开始时向下游发送Observable.

根据数据个数进行缓存, 在结束时向下游发送数组.

类似于catch关键字的operator, 参数是selector函数.

selector函数有两个参数:

  1. 1.
    err: 上游传下来的错误.
  2. 2.
    caught: 上游的Observable.
    selector函数返回Observable作为结果, 该返回值会被订阅并作为上游出错后的延续.

在出错时重试, 参数为最大重试次数.

在出错时由一个notifier函数来控制重试机制.
该notifier函数在一次订阅中只会被调用一次,
因此它被设计成了 (errors: Observable) => Observable.

errors仅当上游出现错误时才会得到数据,
当返回的Observable吐出新数据时, RxJS就会开始重试上游.
由于这种对应关系, 返回的Obsekvable通常是从errors得出的.

retryWhen其实和catchError很像, 只是catchError可以替换上游的Observable, 而retryWhen不能.