merge 和 mergeAll 有什么区别?

What is the difference between merge and mergeAll?

merge 和 mergeAll 有什么区别?他们对我来说似乎是一样的: http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-mergeAll http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-merge

merge 是一种静态创建方法,可以扁平化一组可观察对象。 根据文档

Flattens multiple Observables together by blending their values into one Observable.

简单地说,它将采用一组可观察对象,并将它们压平在一个内,因此每当任何可观察对象发出一个值时,输出都会发出一个值。

mergeAll 然而不同的是,根据文档

,它是一个与高阶可观察对象(发出可观察对象的可观察对象)一起工作的实例方法

Converts a higher-order Observable into a first-order Observable which concurrently delivers all values that are emitted on the inner Observables.

我认为总结起来,但是 mergeAll 可能会造成混淆,所以让我们看看 rxjs 文档提供的这个例子

import { fromEvent, interval } from 'rxjs';
import { take, map, mergeAll } from 'rxjs/operators';

const higherOrder = fromEvent(document, 'click').pipe(
  map((ev) => interval(1000).pipe(take(10))),
);
const firstOrder = higherOrder.pipe(mergeAll(2));
firstOrder.subscribe(x => console.log(x));

你有一个 document click observable(高阶),它 return 一个间隔 observable(内部 observable)每秒发出一个值,它将在 10 个间隔发出后完成,这意味着每次你点击文档,一个新的间隔将被 returned,这里合并所有进来,它将订阅这些间隔 returned 由高阶可观察量,并将它们展平为一个可观察量,一阶observable,参数2,是限制一次并发2个区间,所以如果你点击3次,只有2个会运行,但是由于这2个区间会在10秒后完成,那么你可以再次点击并mergeAll 将订阅新的时间间隔。

mergemergeAll 都继承了 来自 mergeMap !

合并所有

mergeAll 与使用 身份函数调用 mergeMap 相同 (const identity = x => x)

mergeAll() === mergeMap(obs$ => obs$)

示例:

of(a$, b$, c$)
  .pipe(
    mergeAll(),
  )
  .subscribe()

// Same as
of(a$, b$, c$)
  .pipe(
    mergeMap(obs$ => obs$)
  )
  .subscribe()

两者都将订阅传入的可观察对象(a$b$c$)并将它们的值传递给数据消费者。因此,a$b$c$ 被认为是 内部可观察值

合并

有了上一节的知识,理解merge应该不难。

merge(a$, b$, c$).subscribe()

基本相同
const observables = [a$, b$, c$];

new Observable(subscriber => {
  for (let i = 0; i < observables.length; i++) {
    subscriber.next(observables[i]);
  }

  subscriber.complete();
}).pipe(
  mergeAll()
).subscribe();