首页 > 解决方案 > 有没有办法独立处理为多个可观察对象发出的值,然后在所有可观察对象都完成时做一些事情?

问题描述

我正在使用 RXJS 方法,我想处理一个发出的值(当对应的 Observable 完成时),然后在代码的其他地方,跟踪相同的状态Observable(完成、错误、等待.. .)。

第一步是使用forkJoin,它工作正常,但我必须等待所有Observables 完成才能完成工作,如果我subscribe使用一个函数getStuff(x),则Observable它被“消耗”并且forkJoin自然不再使用它。

Observable1 = getStuff(a); // API which returns an observable
Observable2 = GetStuff(b); // API which returns an observable
Observable3 = Getstuff(c); // API which returns an observable
Observable.forkJoin([Observable1, Observable2, Observable3])
  .subscribe(result => doStuff(result) )

我需要处理每个Observable完成时独立发出的所有值,然后,当所有 Observables 都完成时,做一些其他的事情。看起来像:

getStuff(a).subscribe( x => doStuffwitha(x) );
getStuff(b).subscribe( x => doStuffwithb(x) );
getStuff(c).subscribe( x => doStuffwithc(x) );
Observable.forkJoin([getStuff(a), getStuff(b), getStuff(c)])
  .subscribe( result => doStuff(result) )

我没有使用async/awaitPromisesRXJS 方法找到合适的解决方案。

有没有办法在不添加新的“人工”承诺或复杂的解决方法的情况下做到这一点,以保持代码的综合性和可读性?

标签: javascriptangularapiasynchronousrxjs

解决方案


我认为您正在寻找的是tap运算符而不是subscribe

import { tap } from 'rxjs/operators';

getStuff(a).pipe( tap(x => doStuffwitha(x)) );
getStuff(b).pipe( tap(x => doStuffwithb(x)) );
getStuff(c).pipe( tap(x => doStuffwithc(x)) );
Observable.forkJoin([getStuff(a), getStuff(b), getStuff(c)])
  .subscribe( result => doStuff(result) )

推荐阅读