2016-04-26 17 views
7

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.

+0

'empty' jest funkcją i trzeba rzeczywiście nazwać, aby uzyskać rzeczywiste obserwowalne:' powrócić Observable.empty(); ' – Brandon

+1

Można również użyj funkcji strzałek '.catch ((err) => this.handleError (err))' –

+0

Zauważyłem, że funkcje strzałek są o wiele czystsze, aby móc używać 'this', w porównaniu do bind. – Joao

Odpowiedz

6

myślę, że to nie to, co chcesz:

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

Robię właśnie to, próbowałem również 'return Observable.empty()', ale nadal otrzymuję 'Can not read property 'subscribe' of undefined'. Nie jestem pewien, czy to ma związek z niszczącym komponentem ??? – Joao

+0

@Joao To nie ma związku. Domyślam się, że lepiej jest stworzyć nowe pytanie z kodem, który pokazuje, co próbujesz. –

+0

Dzięki. opublikowane http://stackoverflow.com/questions/37213494/angular-2-redirect-in-http-rxjs-catch-callback-causes-typeerror-cannot-read-pro – Joao

Powiązane problemy