使用多个有序异步服务

时间:2018-12-31 17:59:49

标签: angular typescript angular-services

我有多个服务注入到我的组件中。其中两个提供了一个对象列表,这些对象用于查找我的第三项服务所需的项目。我的问题是对它们的异步调用并不总是井井有条。将呼叫相互嵌套似乎在每种情况下都行不通,而且无论如何也无法嵌套。如何强制我的服务加载它们的所有值,以便可以使用它们?我尝试将服务放入响应程序并在其构造函数中加载它们的响应,然后尝试在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。任何帮助,将不胜感激。谢谢。

2 个答案:

答案 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]
  }

希望有帮助