javascript – Observable – 401导致forkJoin错误输出

我使用forkJoin来发出几个服务器请求.这是我通常在我的应用程序中使用的模式,它一直很好用.但是我们刚刚开始实现在后端完成的用户角色.我不确定实现角色的最佳实践是什么,因为我主要是前端开发人员,但这是我遇到的问题:

我们的应用程序具有成员和管理员角色.

>从每个视图中,我必须为成员和管理员成员角色调用后端,无论前端是否确定了角色.
>成员数据总是返回两个角色,因为成员和管理员都有个人数据.
>仅在用户是管理员时才会返回对管理员数据的请求.只要用户没有管理员访问权限,请求就会返回401错误.这是我遇到问题的地方.

每当调用返回401时,我的subscribe方法中的错误方法被调用,并且我无法访问所做的任何调用,包括与成员数据相关的调用.

在我在forkJoin中包含的代码中,有五个调用传递给该方法.如果用户是管理员,则第三次和第四次调用仅返回数据,而对于成员或管理员,总是返回其余的调用.

当用户不是管理员时,第三个调用返回401并且流停止并且我的subscribe方法中的错误处理程序被调用.这显然不是我想要的.我希望流继续,以便我可以使用_data方法中的数据.

我只使用了RXJS 6个月并且正在学习.也许我应该使用不同的模式,或者可能有办法解决这个问题.任何有关代码示例的帮助将不胜感激.在我的代码示例下面,我包含了另一个代码示例,其中我试图通过使用catch方法来解决问题.它没用.

我的视图获取方法:

private getZone() {
  this.spinner.show();
  this.zonesService.getZone(this.zoneId)
    .map(response => {
      this.zone = response['group'];
      return this.zone;
    })
    .flatMap(() => {
      return Observable.forkJoin(
        this.teamsService.getTeam(this.zone['TeamId']),
        this.zonesService.getZoneAssociations(this.zone['id'], '/myDevices'),
        this.zonesService.getZoneAssociations(this.zone['id'], '/devices'),
        this.zonesService.getZoneAssociations(this.zone['id'], '/groupMembers'),
        this.sitesService.getSite(this.zone['SiteId'])
      );
    })
    .subscribe(
      _data => {
        // data handling...
      },
      _error => {
        // error handling ...
      }
    );
}

我尝试修复:

private getZone() {
  this.spinner.show();
  this.zonesService.getZone(this.zoneId)
    .map(response => {
      this.zone = response['group'];
      return this.zone;
    })
    .flatMap(() => {
      return Observable.forkJoin(
        this.teamsService.getTeam(this.zone['TeamId']),
        this.zonesService.getZoneAssociations(this.zone['id'], '/myDevices'),
        this.zonesService.getZoneAssociations(this.zone['id'], '/devices')
          .catch(error => Observable.throw(error)),
        this.zonesService.getZoneAssociations(this.zone['id'], '/groupMembers')
          .catch(error => Observable.throw(error)),
        this.sitesService.getSite(this.zone['SiteId'])
      );
    })
    .subscribe(
      _data => {
        // data handling...
      },
      _error => {
        // error handling...
      }
    );
}

最佳答案 返回Observable.throw只会重新抛出捕获的错误,这将看到forkJoin发出错误.

相反,你可以使用Observable.of(null)发出null然后完成,这将看到forkJoin为发出错误的observable发出一个null:

  return Observable.forkJoin(
    this.teamsService.getTeam(this.zone['TeamId']),
    this.zonesService.getZoneAssociations(this.zone['id'], '/myDevices'),
    this.zonesService.getZoneAssociations(this.zone['id'], '/devices')
      .catch(error => Observable.of(null)),
    this.zonesService.getZoneAssociations(this.zone['id'], '/groupMembers')
      .catch(error => Observable.of(null)),
    this.sitesService.getSite(this.zone['SiteId'])
  );

或者,如果您想将错误作为值发出,则可以使用Observable.of(错误).

点赞