2017-07-13 7 views
2

Ich verwende forkJoin, um mehrere Serveranfragen zu stellen. Dies ist ein Muster, das ich häufig durch meine Anwendung verwendet habe und es hat großartig funktioniert. Wir haben jedoch gerade mit der Implementierung von Benutzerrollen begonnen, die im Backend ausgeführt werden. Ich bin mir nicht sicher, was ist die beste Praxis für die Implementierung von Rollen, wie ich meist ein Front-End-Entwickler bin, aber das ist das Problem, das ich begegnet bin:Observable - 401 verursacht forkJoin, um Fehler zu beseitigen

Unsere Anwendung hat Mitglied und Admin-Mitglied Rollen.

  1. Aus jeder Ansicht, die ich Anrufe an das Backend für beide Mitglied und Admin Mitgliederrollen machen muß unabhängig als Rollen nicht auf dem Frontend bestimmt werden.

  2. Mitgliedsdaten werden immer für beide Rollen zurückgegeben, da Mitglieder und Verwaltungsmitglieder beide über persönliche Daten verfügen.

  3. Anfragen für Admin-Daten werden nur zurückgegeben, wenn der Benutzer ein Administrator ist. Wenn der Benutzer keinen Administratorzugriff hat, gibt die Anforderung einen 401-Fehler zurück. Hier habe ich ein Problem.

Jedes Mal, wenn der Anruf ein 401, die Error-Methode in meiner abonnieren Methode gibt aufgerufen wird, und ich habe keinen Zugang zu einem der Anrufe, die mit den an die Mitgliedsdaten verknüpfen Anrufe getätigt wurden.

In meinem eingeschlossenen Code innerhalb des ForkJoin werden fünf Aufrufe an die Methode übergeben. Der dritte und vierte Aufruf gibt nur Daten zurück, wenn der Benutzer ein Administrator ist, während der Rest der Aufrufe immer für entweder Mitglied oder Administrator zurückgegeben wird.

Wenn der Benutzer kein Administrator ist, gibt der dritte Aufruf eine 401 zurück und der Stream stoppt und der Fehlerhandler in meiner subscribe-Methode wird aufgerufen. Das ist offensichtlich nicht das, was ich will. Ich möchte, dass der Stream fortgesetzt wird, damit ich die Daten in der _data-Methode verwenden kann.

Ich habe RXJS erst seit 6 Monaten benutzt und lerne. Vielleicht sollte ich ein anderes Muster verwenden oder vielleicht gibt es eine Möglichkeit, das zu beheben. Jede Hilfe bei Codebeispielen würde sehr geschätzt werden. Unter meinem Codebeispiel habe ich ein weiteres Codebeispiel eingefügt, in dem ich versuchte, das Problem zu beheben, indem ich mit Fangmethoden herumspielte. Es hat nicht funktioniert.

My View get-Methode:

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 ... 
     } 
    ); 
} 

Mein Versuch zu beheben:

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... 
     } 
    ); 
} 

Antwort

0

Rückkehr Observable.throw die gefangenen Fehler nur erneut auslösen, die forkJoin emittieren sehen der Fehler.

Stattdessen könnten Sie Observable.of(null) verwenden null auszusenden und dann vollständig, die forkJoin sehen eine null für die beobachtbaren emittieren, die den Fehler emittiert:

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']) 
); 

Oder, wenn Sie den Fehler als ein emittieren wollte Wert, könnten Sie Observable.of(error) verwenden.

+0

Vielen Dank. Das war großartig und es hat perfekt funktioniert. – Aaron

Verwandte Themen