首页 > 解决方案 > RxJS:完成时与单个发射合并

问题描述

是否有一个 RxJS 工厂函数(或更一般地说是一种模式)将几个其他的合并在一起,但在所有这些都完成后才发出一次?

我想要这个的用例是等待几个并行操作,然后在它们完成后执行其他操作。对于 Promise,可以这样做:

Promise.all(A, B, C).then(() => console.log('done'));

对于 observables,我想出的最好的方法是

merge(A, B, C).pipe(takeLatest(1)).subscribe(() => console.log('done'));

但是,这并不能说明ABC为空。而且它不会为订阅者提供确定性的价值。这个用例没有简单的内置解决方案吗?

标签: rxjs

解决方案


您可以使用forkJoin。一旦所有给定的 observables 完成,这个操作符就会发出。

const { Observable, of, forkJoin } = rxjs;

const obs1$ = new Observable(subscriber => {
  subscriber.next('obs1$ - value 1');
  subscriber.next('obs1$ - value 2');
  subscriber.complete();
})
const obs2$ = of('obs2$');
const obs3$ = of('obs3$');

const result$ = forkJoin(
  obs1$,
  obs2$,
  obs3$
);

result$.subscribe(v => console.log(v));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.3/rxjs.umd.min.js"></script>


推荐阅读