Наблюдаемый - 401, вызывающий ошибку forkJoin

Я использую forkJoin для выполнения нескольких запросов к серверу. Это шаблон, который я обычно использую в своем приложении, и он отлично работает. Однако мы только начали реализовывать роли пользователей, которые выполняются на бэкэнде. Я не уверен, что лучше всего использовать для реализации ролей, поскольку я в основном разработчик внешнего интерфейса, тем не менее, это проблема, с которой я столкнулся:

В нашем приложении есть роли участника и администратора.

  1. Из каждого представления я должен совершать вызовы на серверную часть для ролей участников и администраторов, независимо от того, что роли не определены во внешнем интерфейсе.

  2. Данные участников всегда возвращаются для обеих ролей, поскольку у членов и администраторов есть личные данные.

  3. Запросы, сделанные для данных администратора, возвращаются только тогда, когда пользователь является администратором. Всякий раз, когда у пользователя нет прав администратора, запрос возвращает ошибку 401. Вот тут у меня проблема.

Всякий раз, когда вызов возвращает 401, вызывается метод ошибки в моем методе подписки, и у меня нет доступа ни к одному из вызовов, которые были сделаны, включая вызовы, связанные с данными члена.

В моем включенном коде в forkJoin есть пять вызовов, переданных в метод. Третий и четвертый вызовы возвращают данные только в том случае, если пользователь является администратором, в то время как остальные вызовы всегда возвращаются либо для участника, либо для администратора.

Когда пользователь не является администратором, третий вызов возвращает 401, и поток останавливается, и вызывается обработчик ошибок в моем методе подписки. Это явно не то, чего я хочу. Я хочу, чтобы поток продолжался, чтобы я мог использовать данные в методе _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...
      }
    );
}

person Aaron    schedule 13.07.2017    source источник


Ответы (1)


Возврат 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).

person cartant    schedule 13.07.2017
comment
Спасибо. Это было потрясающе, и это сработало отлично. - person Aaron; 13.07.2017
comment
Это отличный ответ, и вы должны получить гораздо больше очков за него. - person pbialy; 04.06.2018