我有一个可观察的流,在使用对象中找到的两个id检索初始对象后进行两次调用。其中一个id是可选的,可能存在也可能不存在。 siteId是可选的id。如果发现我必须完全按照getTeam的要求拨打电话。如何进行有条件的通话?我能够让它工作的唯一方法是通过在subscribe方法中检查id并从那里进行调用。但是,代码将具有我想要避免的嵌套订阅。
private getZone() {
this.spinner.show();
this.zonesService.getZone(this.zoneId)
.map(response => {
this.zone = response['group'];
this.teamId = this.zone['TeamId'];
this.siteId = this.zone['SiteId'];
return this.zone;
})
.flatMap(() => this.teamsService.getTeam(this.teamId))
.map(response => {
if (response['team']) {
this.team = response['team'];
if (this.team['personal']) { this.team['name'] = 'Personal Team'; }
this.zone['teamName'] = this.team['name'];
}
return response;
})
.subscribe(
_data => {
if (this.zone['personal']) { this.zone['name'] = 'My Personal Zone'; }
if (this.siteId) {
this.sitesService.getSite(this.siteId)
.subscribe(
_data => {
this.site = _data['site'];
}
);
}
this.spinner.hide();
this.loading = false;
}
);
}
非常感谢任何帮助。感谢。
答案 0 :(得分:0)
如果我没错,你可以获得在第一次通话时使用的所有值(zonesService.getZone),如果你在此时分割你的流(也许是分享它)并单独调用它其他2个端点,你可以并行处理,并使用" null"可以通过sitesService.getSite(defaultIfEmpty运算符)观察,然后使用zip函数再次合并em。
答案 1 :(得分:0)
您可以在第一个flatMap()
中使用forkJoin()方法this.zonesService.getZone(this.zoneId)
.flatMap(response => {
this.zone = response['group']
if(this.zone.SiteId){
// make these 2 api calls in parallel
return Observable.forkJoin(
this.getTeam(this.zone.TeamId),
this.getSite(this.zone.SiteId)
);
}else{
// make single api call
return this.getTeam(this.zone.TeamId);
}
}).subscribe(response => {
// note that your response will be different based on the flatMap().
// When you do the 2 calls in parallel, your response = [getTeamResponse, getSiteResponse]
// but when you just do the single call, your response = getTeamResponse
// so you'll need a check in here to account for that
});
所以在功能上发生的是你进行初始的api通话。然后,如果该响应返回了网站ID,请创建团队&网站并行调用,否则让单个团队调用。
这是forkJoin的一个很好的资源:https://coryrylan.com/blog/angular-multiple-http-requests-with-rxjs