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
.
'empty' eine Funktion ist, und Sie müssen wirklich nennen es eine tatsächliche beobachtbar zu bekommen:' Rückkehr Observable.empty(); ' – Brandon
Sie können auch benutze die Pfeilfunktionen '.catch ((err) => this.handleError (err))' –
Ich fand Pfeilfunktionen als einen viel saubereren Ansatz, um 'this' im Vergleich zu bind zu verwenden. – Joao