更好的方法是在另一个observable之后使用fork join

时间:2017-06-01 14:02:32

标签: javascript angular rxjs

我的登录过程具有相当复杂的登录变体,并且必须具有可扩展性,以便将来轻松添加更多内容。因此,最初用户以典型方式进行身份验证,并返回用户对象。然后我必须进行额外的http调用以获取将在用户被授予访问应用程序权限之前确定各种要求的信息。这是使用用户对象中返回的一些值完成的。我想以一种方式编写代码,我可以轻松添加http调用,而无需更改当前代码,因此我认为使用fork join进行后续调用会很好,因为它们可以并行完成。以下是我的工作代码。

我可以轻松地向fork join调用添加新请求,虽然它对我来说看起来不是太糟糕但我被告知嵌套订阅是一种代码味道,通常是不好的做法。关于如何做得更好的任何想法都会很棒。

感谢。

this.authenticate.login(this.model)
  .subscribe(
    _data => {
      this.subscription = Observable.forkJoin(
        this.devicesHttp.getDevicesByMacAddress(this.macAddress),
        this.teamsService.getTeamsByUserId(_data['userId'])
      );

      this.subscription.subscribe(
        _data => {
          // Check login type and other stuff...
        }
      );
    }
  );

2 个答案:

答案 0 :(得分:0)

例如,使用concatMap()运算符:

this.authenticate.login(this.model)
    .concatMap(_data => Observable.forkJoin(
        this.devicesHttp.getDevicesByMacAddress(this.macAddress),
        this.teamsService.getTeamsByUserId(_data['userId'])
    ))
    .subscribe(_data => {
          // Check login type and other stuff...
    });

forkJoin中的Observable将并行运行,forkJoin将等到它们都完成。

同样concatMap()等待内部Observable完成,然后再推动结果。

答案 1 :(得分:0)

这个怎么样:

this.authenticate.login(this.model)
  .switchMap(data => Observable.forkJoin(
    this.devicesHttp.getDevicesByMacAddress(this.macAddress),
    this.teamsService.getTeamsByUserId(data['userId'])
  ))
  .subscribe(...,...)