2016-04-26 8 views
7

Ich habe einen Dienst, der eine apiAngular 2. Wie behandelt man 4xx Fehler mit Umleitung in Observable?

getItems(itemId: number): Observable<any> { 
    return this.http.get(url, headers) 
     .map(this.extractDataSingle) 
     .catch(this.handleError) 
} 

ruft Wenn der Server mit einem 4xx antwortet der catch Teil genannt wird. Hier ist meine handleError Methode.

private handleError = (error: any) => { 
    //Here I want to redirect to login. 
} 

Ich möchte die login Seite umleiten. Einfach eingeben this._router.navigate(['Login']); funktioniert nicht, da ich eine Observable zurückgeben muss. Die Rückgabe einer leeren Observable return Observable.empty; funktioniert auch nicht, denn dann bekomme ich einen Fehler mit meinen Abonnenten: Cannot read property 'subscribe' of undefined.

Wie kann ich erreichen, dass ich den Benutzer auf die Anmeldeseite umleiten? Natürlich kann ich meine Abonnenten ändern, um den Fehler zu erkennen und über meine Abonnenten umzuleiten. Aber ich denke, es ist besser, den Fehler in meinem Dienst zu behandeln.

Ich bin auch offen für völlig andere Lösungen wie 4xx Fehler zu behandeln.

EDIT: Danke an @ GüntherZöschbauer. Die return Observable.of([]); ist genau das, was ich brauchte. Beachten Sie jedoch this. Um den Zugang zu den router bei der Verwendung handleError Methode bind(this) in .catch(this.handleError.bind(this))

getItems(itemId: number): Observable<any> { 
    return this.http.get(url, headers) 
     .map(this.extractDataSingle) 
     .catch(this.handleError.bind(this)) 
} 

zu haben Ansonsten haben Sie keinen Zugriff auf Ihre router.

+0

'empty' eine Funktion ist, und Sie müssen wirklich nennen es eine tatsächliche beobachtbar zu bekommen:' Rückkehr Observable.empty(); ' – Brandon

+1

Sie können auch benutze die Pfeilfunktionen '.catch ((err) => this.handleError (err))' –

+0

Ich fand Pfeilfunktionen als einen viel saubereren Ansatz, um 'this' im Vergleich zu bind zu verwenden. – Joao

Antwort

6

Ich denke, das ist, was Sie wollen:

private handleError = (error: any) => { 
    this._router.navigate(['Login']); 
    return Observable.of([]); 
} 
+0

Ich mache gerade das, ich versuchte auch 'return Observable.empty()', aber ich bekomme immer noch 'Kann Eigenschaft 'subscribe' von undefined nicht lesen. Ich bin mir nicht sicher, ob das mit der Zerstörung der Komponente zu tun hat ??? – Joao

+0

@ Joao Das klingt nicht verwandt. Ich denke, es ist besser, eine neue Frage mit dem Code zu erstellen, der zeigt, was Sie versucht haben. –

+0

Danke. gepostet http://stackoverflow.com/questions/37213494/angular-2-redirect-in-http-rxjs-catch-callback-causes-typeerror-cannot-read-pro – Joao