4

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

4

2 回答 2

5

两者mergemergeAll 继承mergeMap!

合并所有

mergeAllmergeMap与使用标识函数( 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()

两者都将订阅传入的 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();
于 2020-04-04T14:17:08.140 回答
4

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

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

合并

简单地说,它需要一组可观察对象,并将它们展平在一个内,所以每当任何可观察对象发出一个值时,输出都会发出一个值。

mergeAll然而不同的是,它是一个实例方法,它适用于高阶可观察对象(一种发出可观察对象的可观察对象),根据文档

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

我想总结一下,但是 mergeAll 可能会让人困惑,所以让我们看一下 rxjs docs 提供的这个例子

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));

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

于 2020-04-04T06:01:16.960 回答