Mun*_*zer 9

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

通过将多个 Observable 的值混合到一个 Observable 中,将多个 Observable 扁平化在一起。

合并

简而言之,它将采用一组可观察量,并将它们展平为一个,因此每当任何可观察量发出一个值时,输出都会发出一个值。

mergeAll然而不同的是,根据文档,它是一种与高阶可观察量(发出可观察量的可观察量)一起使用的实例方法

将高阶 Observable 转换为一阶 Observable,它同时传递内部 Observable 上发出的所有值。

我认为这就是总结,但是 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));
Run Code Online (Sandbox Code Playgroud)

你有一个文档单击可观察(高阶),它返回一个间隔可观察(内部可观察),每秒发出一个值,它将在发出 10 个间隔后完成,这意味着每次单击文档时,都会返回一个新的间隔,这里 merge all 出现,它将订阅由高阶 observable 返回的这些间隔,并将它们展平为一个 observable,第一阶 observable,参数 2,是一次限制为 2 个并发间隔,所以如果您单击了 3 次,只会运行 2 次,但是由于这 2 个间隔将在 10 秒后完成,因此您可以再次单击,mergeAll 将订阅新的间隔。


And*_*tej 5

双方mergemergeAll 继承mergeMap

合并所有

mergeAllmergeMap与使用恒等函数调用( const identity = x => x) 相同

mergeAll() === mergeMap(obs$ => obs$)
Run Code Online (Sandbox Code Playgroud)

例子:

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

// Same as
of(a$, b$, c$)
  .pipe(
    mergeMap(obs$ => obs$)
  )
  .subscribe()
Run Code Online (Sandbox Code Playgroud)

两者都将订阅传入的 observables( 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();
Run Code Online (Sandbox Code Playgroud)