rxjs随笔2理解操作符

43次阅读

共计 1416 个字符,预计需要花费 4 分钟才能阅读完成。

看 rxjs 文档的时候,我总是被 merge -> mergeAll -> mergeMap 等类似的名称的操作符困扰。一直在思考这里面是不是有什么联系,结论:merge 与 (mergeAll && mergeMao) 没有任何关系,就像这篇文章和白洁没有任何关系一样。

注:虽然每个操作符都会返回一个新的 observables 对象,但是每个操作符接受的参数都是上一个操作符返回的值,即上一个操作符完成后返回的新的 observables 的具体的 value,也是上一个操作符中的函数返回的具体的值

merge mergeMap mergeAll

merge: 用来合并两个 Observables 对象,有两种使用方式。函数签名: merge(input: Observable): Observable(注:函数签名很重要,这里能看到 merge 接受的参数是 observable 对象。

// RxJS v6+
import {mapTo} from 'rxjs/operators';
import {interval, merge} from 'rxjs';

// 每 2.5 秒发出值
const first = interval(2500);
// 每 2 秒发出值
const second = interval(2000);
// 每 1.5 秒发出值
const third = interval(1500);
// 每 1 秒发出值
const fourth = interval(1000);

// 从一个 observable 中发出输出值
const example = merge(first.pipe(mapTo('FIRST!')),
  second.pipe(mapTo('SECOND!')),
  third.pipe(mapTo('THIRD')),
  fourth.pipe(mapTo('FOURTH'))
);
// 输出: "FOURTH", "THIRD", "SECOND!", "FOURTH", "FIRST!", "THIRD", "FOURTH"
const subscribe = example.subscribe(val => console.log(val));

或者

// RxJS v6+
import {merge} from 'rxjs/operators';
import {interval} from 'rxjs';

// 每 2.5 秒发出值
const first = interval(2500);
// 每 1 秒发出值
const second = interval(1000);
// 作为实例方法使用
const example = first.pipe(merge(second));
// 输出: 0,1,0,2....
const subscribe = example.subscribe(val => console.log(val));

mergeAll

mergeAll: 收集并订阅所有的 observables; 函数签名:mergeAll(concurrent: number): Observable
可以说 mergeAll 与 merge 没有任何关系。merge 的作用是 merge(ob1, ob2, ob3) 将多个 observable 对象合并为一个对象,这个对象按照三个对象的完成先后发出数据流。mergeAll 是作为操作符,对上游传出的数据流进行操作,而操作内容就是如果数据为 observable 对象则订阅该对象。mergeAll 接受数字参数,表示同时最多“并发”订阅多少 observable 对象,剩下的将在下次进行订阅

正文完
 0