mam usługę, która wywołuje APIKątowa 2. Jak radzić sobie z błędami 4xx z przekierowaniem w Obserwowalnym?
getItems(itemId: number): Observable<any> {
return this.http.get(url, headers)
.map(this.extractDataSingle)
.catch(this.handleError)
}
Jeśli serwer odpowiada z 4xx catch
część nazywa. Oto moja metoda handleError
.
private handleError = (error: any) => {
//Here I want to redirect to login.
}
Chcę przekierować na stronę login
. Po prostu wpisując this._router.navigate(['Login']);
nie działa, ponieważ muszę zwrócić Observable
. Zwrócenie pustego obiektu Observable return Observable.empty;
również nie działa, ponieważ wystąpił błąd z subskrybentami: Cannot read property 'subscribe' of undefined
.
W jaki sposób mogę przekierować użytkownika na stronę logowania? Oczywiście mogę zmienić abonentów, aby złapać błąd i przekierować za pośrednictwem moich subskrybentów. Ale myślę, że lepiej jest poradzić sobie z błędem w mojej usłudze.
Jestem również otwarty na zupełnie inne rozwiązania, jak radzić sobie z błędami 4xx.
EDYTOWANIE: Dzięki @ GüntherZöschbauer. return Observable.of([]);
jest dokładnie tym, czego potrzebowałem. Należy jednak pamiętać o this
. W celu uzyskania dostępu do router
w korzystaniu handleError
metoda bind(this)
w .catch(this.handleError.bind(this))
getItems(itemId: number): Observable<any> {
return this.http.get(url, headers)
.map(this.extractDataSingle)
.catch(this.handleError.bind(this))
}
przeciwnym razie nie masz dostępu do swojego router
.
'empty' jest funkcją i trzeba rzeczywiście nazwać, aby uzyskać rzeczywiste obserwowalne:' powrócić Observable.empty(); ' – Brandon
Można również użyj funkcji strzałek '.catch ((err) => this.handleError (err))' –
Zauważyłem, że funkcje strzałek są o wiele czystsze, aby móc używać 'this', w porównaniu do bind. – Joao