【问题标题】:Working with multiple nested subscriptions in sequence (Angular, RxJs)按顺序处理多个嵌套订阅(Angular、RxJs)
【发布时间】:2020-08-03 11:27:18
【问题描述】:

我需要从三个 Observable 流的结果构造一个嵌套对象并显示 .所有三个可观察对象都返回一个数组,其中两个取决于第一个的结果。我的代码如下:

this.selectActiveFoos$.pipe(
  concatMap(foos => {
    return foos.map(foo => {
      let bars$ = this.barQuery.selectBarsByFooId(foo.id);  
      let bazs$ = this.bazQuery.selectBazsByFooId(foo.id); // these observables return Observable<T[]>
      return forkJoin([bars$, bazs$]).pipe(
        map(([bars, bazs]) => {
          return { 
            foo: foo,
            bars: bars,
            bazs: bazs
          }
        })
      );
    });
  })).subscribe(result => {
    console.log(result);
  });

}

IntelliSense 告诉我结果的类型符合预期,即 a

{ foo: foo, bars: bar[], bazs: baz[] }

然而,控制台会记录一个 observable 作为输出。这真的让我陷入了困境。我在网上搜索了很长时间,但似乎找不到适用于 Observable 嵌套数组的答案。

如果有任何建议,我将不胜感激!

【问题讨论】:

  • 您可能会为 foos 数组的每个元素返回 [forkJoin(), forkJoin(),..]。您需要展示该数组的结构以及forkJoin 的每个可观察对象的外观。

标签: angular typescript rxjs observable


【解决方案1】:

concatMap 必须接收一个 Observable,你可以使用 forkJoin:

this.selectActiveFoos$.pipe(
  concatMap(foos => {
    return forkJoin(foos.map(foo => {
      let bars$ = this.barQuery.selectBarsByFooId(foo.id);  
      let bazs$ = this.bazQuery.selectBazsByFooId(foo.id); // these observables return Observable<T[]>
      return forkJoin([bars$, bazs$]).pipe(
        map(([bars, bazs]) => {
          return { 
            foo: foo,
            bars: bars,
            bazs: bazs
          }
        })
      );
    }));
  })).subscribe(result => {
    console.log(result);
  });
}

【讨论】:

  • 这成功了!非常感谢你。如果 concatMap 必须接收 observable,为什么它不显示编译时错误?
  • @E.Mumford 接受答案(如果有效)。你有什么版本的 typescript 和 rxjs?
  • 我的错误。第一个问题 :) Typescript 是 ~3.7.5 而 RxJs 是 ~6.5.4
猜你喜欢
  • 2021-11-18
  • 2020-08-18
  • 2016-12-23
  • 2018-12-11
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多