Javascript 可观察-401导致forkJoin出错

Javascript 可观察-401导致forkJoin出错,javascript,angular,rxjs,observable,fork-join,Javascript,Angular,Rxjs,Observable,Fork Join,我正在使用forkJoin发出几个服务器请求。这是我在整个应用程序中经常使用的一种模式,它一直非常有效。然而,我们刚刚开始实现在后端完成的用户角色。我不确定实现角色的最佳实践是什么,因为我主要是一名前端开发人员,尽管如此,这是我遇到的问题: 我们的应用程序具有成员和管理成员角色 从每个视图中,我都必须为成员和管理员成员角色调用后端,因为角色不是在前端确定的 始终为两个角色返回成员数据,因为成员和管理员成员都有个人数据 只有当用户是管理员时,才会返回对管理员数据的请求。只要用户没有管理员权限,请求

我正在使用forkJoin发出几个服务器请求。这是我在整个应用程序中经常使用的一种模式,它一直非常有效。然而,我们刚刚开始实现在后端完成的用户角色。我不确定实现角色的最佳实践是什么,因为我主要是一名前端开发人员,尽管如此,这是我遇到的问题:

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

  • 从每个视图中,我都必须为成员和管理员成员角色调用后端,因为角色不是在前端确定的

  • 始终为两个角色返回成员数据,因为成员和管理员成员都有个人数据

  • 只有当用户是管理员时,才会返回对管理员数据的请求。只要用户没有管理员权限,请求就会返回401错误。这就是我遇到的问题

  • 每当调用返回401时,我的subscribe方法中的error方法就会被调用,我无权访问任何调用,包括与成员数据关联的调用

    在我的forkJoin中包含的代码中,有五个调用被传递到该方法中。如果用户是管理员,则第三次和第四次调用仅返回数据,而其余调用始终为成员或管理员返回

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

    我使用RXJS才6个月,正在学习。也许我应该使用一种不同的模式,或者也许有办法解决这个问题。任何代码示例方面的帮助都将不胜感激。在我的代码示例下面,我包含了另一个代码示例,其中我尝试通过使用catch方法来解决问题。它不起作用

    我的视图获取方法:

    我的修复尝试:


    返回
    Observable.throw
    将重新显示捕获的错误,这将看到
    forkJoin
    发出错误

    相反,您可以使用
    Observable.of(null)
    发出
    null
    ,然后完成,这将看到
    forkJoin
    发出错误的可观察对象发出
    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(error)

    谢谢。这是一个很棒的答案,你应该得到更多的分数。
    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...
          }
        );
    }
    
      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'])
      );