您需要使用组合运算符,如forkJoin
,combineLatest
或zip
并行触发多个可观察对象。鉴于它是一个 API 调用,我会说它forkJoin
更适合这里,因为它仅在所有源都完成后才会发出。一个简短的区别 b/n 他们在这里。
您还需要使用Array#map
将对象数组转换为 HTTP 调用数组。之后,您可以map
对每个可观察的源使用 RxJS 运算符,以将其转换回具有修改后courseInfo
属性的对象。
this.apiService.getIntakeEvents(90430).pipe(
mergeMap((res: any) =>
forkJoin(
res.map(item => this.apiService.getSpecificCourse(item.courseId)).pipe(
map(courseInfo => ({ ...item, courseInfo: courseInfo }))
)
)
)
).subscribe(
next: (res: any) => {
console.log(res)
},
error: (error: any) => {
// handle error
}
);
更新:API 调用对象中的多个属性
要从外部 observable 更新对象中的多个属性,您可能必须使用forkJoin
包装在外部的多个 s forkJoin
。这当然只是一种方法,可能还有其他更好的方法。
例子
this.apiService.getIntakeEvents(90430).pipe(
mergeMap((res: any) =>
forkJoin({
courses: forkJoin(res.map(item => this.apiService.getSpecificCourse(item.courseId))),
names: forkJoin(res.map(item => this.apiService.getSpecificName(item.courseId))),
ages: forkJoin(res.map(item => this.apiService.getSpecificAge(item.courseId)))
}).pipe(map(({courses, names, age}) =>
res.map((item, index) => ({
...item,
courseInfo: courses[index],
name: names[index],
age: ages[index]
})
))
)
).subscribe(
next: (res: any) => {
console.log(res)
},
error: (error: any) => {
// handle error
}
);