2016-11-22 8 views
0

Ich habe meinen eigenen Observable Service erstellt, der die aktuellen Tracks eines Players zurückgibt.Angular 2 Observable Fehlerbehandlung

ich diesen Dienst auf meinem Angular Komponente abonnieren so:

this.playerSubscription = this.player 
     .player(playlist) 
     .subscribe(
     playerInfo => this.playerInfo = playerInfo, 
     error => this.router.navigate(['login'], { queryParams: { error: 'expired_token' }}) 
    ); 

Wie man sehen kann, wenn ich einen Fehler haben, leite ich den Benutzer auf die Login-Seite.

Das Problem ist, wenn ich nach einem vorherigen Fehler anmelden, das Abonnement zurück zu mir die neuesten Fehler-Sequenz und ich werde erneut auf die Anmeldeseite umgeleitet.

In meinem Dienst verwende ich das BehaviorSubject und mache subject.next(message) für gültige Sequenzen und subject.error(error), um eine Fehlersequenz zu senden.

Wie kann ich den letzten Fehler nach der Neuanmeldung zu meinem Observable vergessen?

Vielen Dank!

UPDATE 1:

Ich habe einige neue Tests hier und es funktioniert nur, wenn ich ein neues Thema jedes Mal schaffe ich zu abonnieren, wie unten:

player(playlist: IPlaylist, fromBegin: boolean): Observable<IPlayerInfo> { 

    this._player = new BehaviorSubject<IPlayerInfo>({ status: PlayerStatuses.LOADING }); 

    ... more code here ... 

    return this._player.asObservable(); 
    } 

Nevermind, wenn es ein Subject ist oder a BehaviorSubject.

Ist das eine gute Praxis?

+0

Ich würde umleiten, um innerhalb der Player-Methode Logik direkt vor subject.error Anruf anmelden oder auth guard für Spieler Route verwenden. –

+0

Ich glaube nicht, dass es eine gute Idee ist, einen Router in einem Dienst hinzuzufügen. Ich denke nicht, dass es eine Serviceverantwortung ist, den Benutzer für die Anmeldeseite umzuleiten. –

Antwort

0

Wie kann ich den letzten Fehler vergessen, nachdem ich meine Observable erneut abonniert habe?

Verwenden Sie Subject anstelle von BehaviorSubject.

var subject = new Rx.Subject(); 

BehaviorSubject ist eine Variante, die Subjectcurrent value erinnern. Wenn Sie also nicht jedes Mal, wenn Sie subscribe verwenden, den neuesten Wert erhalten möchten, verwenden Sie Subject.

+0

Leider hat es nicht funktioniert. Ich werde weiterleiten nach dem Login mit dem letzten Fehler. –

+0

Hallo @Michael, ich aktualisiere nur meine Frage. Habe einige Tests gemacht und es funktioniert nur, wenn ich jedes Mal, wenn ich abonniere, ein neues Thema erstelle. Irgendwelche Gedanken? –

Verwandte Themen