RxJS Angular:听一个可观察的并使用另外两个

时间:2018-02-20 10:46:15

标签: angular rxjs reactive-programming

我使用Redux和RxJS Angular(4)实现来管理状态&动作重新进入我的应用程序。

我正在收听一个事件(产品列表中所选产品ID的更改),因此我们将其称为selectedProductId$

当相关的发射器发出一个新的selectedId值时,我想从这个Observable值中做一个switchMap,以及来自另外两个Observable的最新发射值(让我们说; {{1} }和productDetails$)。

所以"触发变化"应该是selectedProductID,我们会使用productDetails和productComments的最新值进行productComments$

我试过了:

switchMap

然后我订阅了这个observable并在传递的值上设置了一个断点:

// subscribed to the 3 observable passed in combineLatest
 fetchProduct$: Observable<any>;
 this.fetchProduct$ = Observable.combineLatest(
       this.selectedProductId$,
       this.productComments$,
       this.productDetails$
 ).switchMap(
       result => Observable.of(
         {
           'uuid': result[0],
           'comments': result[1],
           'details': result[2]
         }
      )
 );

它可以工作,但每次三个Observable中的一个检测到状态变化时都会调用它。我也尝试了Observable.forkJoin,但是从文档中,它等待三个Observable发出新值,这使我变得怪异,因为我从另一个Webservice获得注释,并且它可以在选择下一个产品Id时检索它。

Observable.merge也不是一个解决方案,因为它只会在一个&#34;频道&#34;上一个接一个地发出值。

我并不完全习惯于反应式编程,也许我没有清楚地看到一个明显的解决方案,但是我知道我会喜欢暗示或帮助解决这个问题:( 非常感谢

2 个答案:

答案 0 :(得分:2)

尝试withLatestFrom,其工作方式类似于combineLatest(),但每次源可观察性触发时都会触发。示例(对于rxjs 5.5):

this.fetchProduct$ = 
  this.selectedProductId$.pipe(
   withLatestFrom(
       this.productComments$,
       this.productDetails$
   ));

或者对于早期版本:

this.fetchProduct$ = 
  this.selectedProductId$.withLatestFrom(
       this.productComments$,
       this.productDetails$
   );

答案 1 :(得分:1)

首先,让我们合并您不想触发任何更改的“额外”可观察量。

const extras$ = Observable.combineLatest(this.productComments$, this.productDetails$);

现在,我们在“有趣”的观察中观察排放,并使用我们的额外值中的最新值。

cosnt allTogether$ = this.selectedProductId$.withLatestFrom(extras$,
    ([uuid, [comments, details]]) => ({uuid, comments, details}) );

现在可以订阅allTogether$