Angular,rxjs:使用flatMap修复嵌套订阅

时间:2019-06-06 15:51:22

标签: angular rxjs ngrx

我对angular和rxjs还是很陌生...我编写了一些要重构的代码,因为我一直在阅读我所做的事情恰好是一种反模式:可观察变量的嵌套订阅。 / p>

我搜索了互联网上的每个地方以找到解决方案(希望我不会错过任何事情),并且理解了我必须做的事情,但不能应用于我的情况:使用flatMap应该可以解决。这是特定的代码:

...
observable1$: Observable<any>;
observable2$: Observable<any>;
...

constructor (...) {
...
    this.observable1$ = this.someStore.pipe(select(Selector.selectMyObs1));
    this.observable2$ = this.someStore.pipe(select(Selector.selectMyObs2));
...
}

...
this.observable1$.subscribe(val1 => {
    if (val1.error === false) {
        this.observable2$.subscribe(val2 => {
            this.someArray.push(val2);
        });
    }
});
...

代码以某种方式工作,但是我不确定我是否很幸运。 我想知道如何使用flatMap重写此代码,因为只有在第一个未检索到任何错误的情况下,我才必须进行第二个订阅。

1 个答案:

答案 0 :(得分:1)

这样-

this.observable1$
    .pipe(
      mergeMap(val1 => {
        if(val1.error === false) {
          return this.observable2$
                     .pipe(
                       tap(val2 => {
                          this.someArray.push(val2);
                       })
                     );
        }

        return of(null);
      })
    ).subscribe();

它将避免多个订阅。在这里,我们构成可观察的物体。