按顺序处理多个嵌套订阅(Angular、RxJs)

按顺序处理多个嵌套订阅(Angular、RxJs),angular,typescript,rxjs,observable,Angular,Typescript,Rxjs,Observable,我需要从三个可观察的流的结果中构造一个嵌套对象,并显示。所有三个观测值都返回一个数组,其中两个取决于第一个数组的结果。我的守则如下: this.selectActiveFoos$.pipe( concatMap(foos => { return foos.map(foo => { let bars$ = this.barQuery.selectBarsByFooId(foo.id); let bazs$ = this.bazQuery.sele

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

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);
  });
但是,控制台会将一个可观察对象记录为输出。这真是让我大吃一惊。我在网上搜索了很长一段时间,但似乎找不到一个适用于可观测数据嵌套数组的答案


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

concatMap必须接收可观察的,您可以使用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);
  });
}
this.selectActiveFoos$.pipe(
concatMap(foos=>{
返回forkJoin(foos.map(foo=>{
让bars$=this.barQuery.selectBarsByFooId(foo.id);
让bazs$=this.bazQuery.selectBazsByFooId(foo.id);//这些可观察的返回可观察的
返回分叉连接([bars$,bazs$])。管道(
地图([bar,baz])=>{
返回{
福:福,
酒吧:酒吧,
巴兹:巴兹
}
})
);
}));
})).订阅(结果=>{
控制台日志(结果);
});
}

是这样的吗?您可能正在为
foos
数组的每个元素返回
[forkJoin(),forkJoin(),…]
。您需要显示该数组的结构是什么,以及
forkJoin
的每个可观察对象应该是什么样子。这是有效的!非常感谢你。如果concatMap必须接收一个可观察的,为什么它不显示编译时错误?@E.Mumford如果它有效,请接受答案。你有什么版本的typescript和rxjs?我错了。第一个问题:)Typescript是~3.7.5,RxJs是~6.5.4
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);
  });
}