我有嵌套的http调用服务。第一次请求后,我想用先前的结果做另一个,并在完成后返回所有数据。我需要使用result [“ Expert”]传递数据,该结果是一个包含对象{User_key:key1}的数组。因此,switchMap的第一步是使用地图运算符并生成JSON,然后将其传递给http请求。
service.ts
getAreaByKey(key: string): Observable<Area> {
return this.http.get<any[]>(`${this.API_URL}/v0/areas/${key}`).pipe(
map(result => {
return {
key: result["Key"],
name: result["Description"],
experts: result["Experts"]
};
}),
switchMap(res => {
res.experts.map(el => {
let json_data = JSON.stringify(el["User_Key"]);
this.expertService.getExpertsByKeys(json_data);
});
})
}
问题是我试图在switchMap之后返回数据,但显示错误。另外,我在开发工具中看不到第二个请求。
答案 0 :(得分:0)
我猜您正在寻找类似combineLatest
的东西吗?您有多个输入可观察对象,但对所有这些对象的结果感兴趣(例如,您的案例中有很多专家)。
尝试这样的事情:
switchMap(res => {
return combineLatest(res.experts.map(el => {
let json_data = JSON.stringify(el["User_Key"]);
return this.expertService.getExpertsByKeys(json_data);
}));
})
答案 1 :(得分:0)
SwithMap需要获得一个可观察的回报。您可以使用forkJoin合并result的所有元素,并生成另一个可观察到的内容,switchMap可以在内部进行预订。
getAreaByKey(key: string): Observable < Area > {
return this.http.get < any[] > (`${this.API_URL}/v0/areas/${key}`)
.pipe(
map(result => {
return {
key: result["Key"],
name: result["Description"],
experts: result["Experts"]
};
}),
switchMap(res => forkJoin([
...res.experts.map(el => this.expertService.getExpertsByKeys(JSON.stringify(el["User_Key"])))])
)
);
}