merge是一种静态创建方法,可以展平可观察组。根据文档
通过将多个 Observable 的值混合到一个 Observable 中,将多个 Observable 扁平化在一起。
简而言之,它将采用一组可观察量,并将它们展平为一个,因此每当任何可观察量发出一个值时,输出都会发出一个值。
mergeAll然而不同的是,根据文档,它是一种与高阶可观察量(发出可观察量的可观察量)一起使用的实例方法
我认为这就是总结,但是 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 将订阅新的间隔。
双方merge并mergeAll 继承自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)