rxjs 里 CombineLatest 操作符的一个使用场景

简介: rxjs 里 CombineLatest 操作符的一个使用场景

一个具体的例子:

combineLatest([
  data$.pipe(startWith(null)),
  loading$,
]).pipe(
  takeWhile(([data, loading]) => !data || loading, true),
  map(([data, loading]) => loading ? null : data),
  skip(1),
  distinctUntilChanged(),
);

我们在这里使用巧妙的 takeWhile 函数。 它只会让带有虚假数据(falsy data)(初始 null )或 truthy loading 的发射值通过,这正是我们需要显示 spinner 的时候。 当条件不满足时,由于第二个参数,我们也让最终值通过。


然后我们使用 map 函数映射结果。 如果 loading 标志位为 true,则 map 返回的值为 null,这很合理,因为 loading 的时候是肯定没有数据返回的。当 loading 标志位为 false,说明数据返回完毕,则返回真实的 data.


我们使用 skip(1) 是因为我们不希望我们的 startWith(null) 数据流通过。 我们使用 distinctUntilChanged 所以多个空值也不会通过。


这里涉及到的知识点:

1.startWith

一个例子:

// RxJS v6+
import { startWith } from 'rxjs/operators';
import { of } from 'rxjs';
//emit (1,2,3)
const source = of(1, 2, 3);
//start with 0
const example = source.pipe(startWith(0));
//output: 0,1,2,3
const subscribe = example.subscribe(val => console.log(val));

上面的 example 订阅后,会打印通过 startWith 传入的初始值 0,然后是 of 包裹的1,2,3


2.takeWhile

这个 Operator 会持续发射数据,直接传入的条件不满足,则终止数据 emit.


注意 takeWhile 和 filter 的区别在于,前者在遇到 condition 为 false 时,会 fire 一个 complete 事件,而后者不会。


下面是一个具体的比较:

// RxJS v6+
import { of } from 'rxjs';
import { takeWhile, filter } from 'rxjs/operators';
// emit 3, 3, 3, 9, 1, 4, 5, 8, 96, 3, 66, 3, 3, 3
const source$ = of(3, 3, 3, 9, 1, 4, 5, 8, 96, 3, 66, 3, 3, 3);
// allow values until value from source equals 3, then complete
source$
  .pipe(takeWhile(it => it === 3))
  // log: 3, 3, 3
  .subscribe(val => console.log('takeWhile', val));
source$
  .pipe(filter(it => it === 3))
  // log: 3, 3, 3, 3, 3, 3, 3
  .subscribe(val => console.log('filter', val));

takeWhile 在遇到 of Observable 里第四个元素即 9 时,就会 fire complete 事件,因此 of Observable 余下的所有元素,再没有被 emit 的机会,而 filter 则不然,最后会打印 of Observable 里所有的元素 3.

相关文章
|
6月前
|
数据库连接 数据库
RxJs 里的 using operator 的使用场景介绍
RxJs 里的 using operator 的使用场景介绍
25 0
|
6月前
Rxjs tap 操作符的使用场景介绍
Rxjs tap 操作符的使用场景介绍
40 0
|
7月前
rxjs ThrottleTime 和 debounceTime 的操作符区别
rxjs ThrottleTime 和 debounceTime 的操作符区别
59 0
|
7月前
Rxjs TakeUntil 操作符的学习笔记
Rxjs TakeUntil 操作符的学习笔记
41 0
|
7月前
rxjs Observable 两大类操作符简介
rxjs Observable 两大类操作符简介
41 1
|
7月前
|
索引
rxjs 里 Skip 操作符的一个使用场景
rxjs 里 Skip 操作符的一个使用场景
83 0
|
前端开发 JavaScript
3 分钟温故知新 RxJS 【创建实例操作符】
RxJS 有很多神奇的东西,包括链式调用、惰性输出值、隔离数据和操作、响应式编程等等; 它是函数式编程中 monad 的一种实际应用;它是 promise 的进化形态;它是理解 JS 异步、处理异步的宝剑...... 所以,借着更文的契机,日日新、月月新,学习 RxJS 接着冲~
|
缓存 前端开发 JavaScript
5 分钟温故知新 RxJS 【转换操作符】
RxJS 转换操作符,继续冲冲冲!熟悉的温故知新,不熟悉的混个脸熟先~
rxjs 里 CombineLatest 操作符的一个使用场景
rxjs 里 CombineLatest 操作符的一个使用场景
58 0
rxjs 里 CombineLatest 操作符的一个使用场景
RxJs SwitchMapTo 操作符之移花接木
RxJs SwitchMapTo 操作符之移花接木
121 0
RxJs SwitchMapTo 操作符之移花接木