具有条件调用的可观察流

时间:2017-06-26 19:16:02

标签: javascript angular rxjs observable

我有一个可观察的流,在使用对象中找到的两个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;
        }
      );
  }

非常感谢任何帮助。感谢。

2 个答案:

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