如何在RxJ中拆分流并重组子流的最终结果

时间:2019-07-11 08:27:26

标签: rxjs

我有一个可以发出两种消息的源流。我想将它们分成两个单独的流,并在原始流完成后,重新组合它们的最终发射值(如果不存在,则重新定义)。

例如

const split1$ = source$.pipe(
     filter(m) => m.kind === 1, 
     mergeMap(m) => someProcessing1());
const split2$ = source$.pipe(
     filter(m) => m.kind === 2, 
     mergeMap(m) => someProcessing2());
forkJoin(split1$, split2$).subscribe(
(output1, output2) => console.log(output1, output2));

问题是,没有任何东西可以保证split1 $和split2 $都会发出值。如果发生这种情况,forkJoin将永远不会发出。 每当源流完成时,我可以用什么替换forkJoin来发出值。

1 个答案:

答案 0 :(得分:1)

关于拆分流: https://www.learnrxjs.io/operators/transformation/partition.html

关于“完成时发射”,您不能只使用complete回调吗? .subscribe(() => console.log('Emitted"), null, () => console.log('Completed'));

否则,您可以使用startWith运算符来确保发出了某些东西。

const [evens, odds] = source.pipe(partition(val => val % 2 === 0));
evens = evens.pipe(startWith(undefined)); // This will emit undefined before everything, so forkJoin will surely emit

startWith构造函数中添加forkJoin

forkJoin(evens.pipe(startWith(undefined)), odds.pipe(startWith(undefined)))
  .subscribe(console.log))