按顺序处理多个嵌套订阅(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);
});
}