我有多个服务注入到我的组件中。其中两个提供了一个对象列表,这些对象用于查找我的第三项服务所需的项目。我的问题是对它们的异步调用并不总是井井有条。将呼叫相互嵌套似乎在每种情况下都行不通,而且无论如何也无法嵌套。如何强制我的服务加载它们的所有值,以便可以使用它们?我尝试将服务放入响应程序并在其构造函数中加载它们的响应,然后尝试在ngOnInit()中调用这些响应,但这也不起作用。
打字稿
constructor(
private stateService: StatesService,
private zoneService: ZoneDetailService,
private countyService: CountyService) {
//gather states from service
this.stateService.GetStates().subscribe(response => {
this.statesResults = response;
//do something with response
});
//gather counties from service
this.countyService.GetCounties().subscribe(response => {
this.countyResults = response;
//gather detail from service
this.zoneService.GetZoneDetails(this.prodPointId).subscribe(response => {
this.state = response.stateCode;
this.apiCountyCode = response.apiCountyCode;
//return single record
let answer = this.countyResults.filter(c => c.countyCode === response.apiCountyCode).map(c => {
return c.id;
});
let answer2 = this.statesResults.filter(c => c.stateCode === response.stateCode).map(c => {
return c.id;
});
如图所示,stateService不会加载stateResults,因此将其保留为“ undefined”,然后过滤器将不起作用。我需要确保在detailService之前先运行stateService和countyService。任何帮助,将不胜感激。谢谢。
答案 0 :(得分:0)
有很多方法可以执行此操作,但是forkJoin可以在这里工作。 ForkJoin接受一系列可观察对象,并在它们全部完成后完成。所以:
&arr
不过,我会警告您,我发现订阅服务中的可观察对象通常是一种不好的代码味道。我通常尝试只订阅组件内部的可观察对象,并在服务的rxjs函数中执行所有逻辑。
答案 1 :(得分:0)
您好,您可以同时执行所有可观察对象,并使用Observable.forkJoin()
等待结果
让我给你看一个例子:
const queries: Observable<any>[] = [];
queries.push(this.countyService.GetCounties());
queries.push(this.stateService.GetStates());
queries.push(this.zoneService.GetZoneDetails(this.prodPointId));
Observable.forkJoin(queries)
.take(1)
.subscribe(data => {
this.countyResults = data[0]
this.statesResults = data[1]
this.zoneDetails = data[2]
}
希望有帮助