2016-04-26 40 views
7

Ho un servizio che chiama un'APIAngolare 2. Come gestire gli errori 4xx con il reindirizzamento in Osservabile?

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

Se il server risponde con un 4xx la parte catch è chiamato. Ecco il mio metodo handleError.

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

Desidero reindirizzare la pagina login. La semplice digitazione di this._router.navigate(['Login']); non funziona poiché devo restituire uno Observable. Il ritorno di un osservabile vuoto return Observable.empty; non funziona, perché in questo caso si verifica un errore con i miei abbonati: Cannot read property 'subscribe' of undefined.

Come posso ottenere che reindirizzi l'utente alla pagina di accesso? Ovviamente posso cambiare i miei abbonati per captare l'errore e reindirizzare tramite i miei abbonati. Ma penso che sia meglio gestire l'errore nel mio servizio.

Sono aperto anche a soluzioni completamente diverse su come gestire gli errori 4xx.

MODIFICA: Grazie a @ GüntherZöschbauer. Il return Observable.of([]); è esattamente ciò di cui avevo bisogno. Tuttavia, essere a conoscenza di this. Al fine di avere accesso al router nel handleError metodo di utilizzo 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)) 
} 

In caso contrario non si ha accesso al router.

+0

'empty' è una funzione ed è necessario chiamare in realtà per ottenere un vero e proprio osservabile:' tornare Observable.empty(); ' – Brandon

+1

È inoltre possibile usa le funzioni freccia '.catch ((err) => this.handleError (err))' –

+0

Ho trovato che le funzioni di freccia sono un approccio molto più pulito per poter usare 'this', rispetto a bind. – Joao

risposta

6

Credo che questo fa ciò che si vuole:

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

Sto facendo proprio questo, ho anche provato 'return Observable.empty()' ma ottengo ancora 'Can not read property 'subscribe' of undefined'. Non sono sicuro se questo ha a che fare con il componente che viene distrutto ??? – Joao

+0

@Joao Ciò non è collegato. Immagino sia meglio creare una nuova domanda con il codice che mostri ciò che hai provato. –

+0

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