2016-04-26 29 views
7

我如果服務器與4XX的catch部分稱爲迴應說調用APIAngular 2.如何使用Observable中的重定向處理4xx錯誤?

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

的服務。 這是我的handleError方法。

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

我想重定向到login頁面。 只需輸入this._router.navigate(['Login']);不起作用,因爲我必須返回Observable。 返回一個空的Observable return Observable.empty;也不起作用,因爲那樣我的用戶就會收到錯誤:Cannot read property 'subscribe' of undefined

我該如何實現將用戶重定向到登錄頁面?當然,我可以更改我的訂閱者,以便通過訂閱者捕獲錯誤並重定向。但我認爲在我的服務中處理錯誤更好。

我也對如何處理4xx錯誤的完全不同的解決方案開放。編輯: 感謝@GüntherZöschbauer。 return Observable.of([]);正是我所需要的。然而,請注意this。爲了在.catch(this.handleError.bind(this))

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

訪問在handleError方法使用bind(this)router否則你不必訪問您的router

+0

'empty'是一個功能,你需要實際調用它來獲得實際觀察到的:'返回Observable.empty();' – Brandon

+1

你也可以使用箭頭函數'.catch((err)=> this.handleError(err))' –

+0

我發現箭頭函數是一個更簡潔的方法來使用'this',而不是綁定。 – Joao

回答

6

我想這你想要做什麼:

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

我正在做這個,我也嘗試'返回Observable.empty()',但我仍然'無法讀取'未定義的屬性'訂閱'。我不確定這是否與被銷燬的組件有關? – Joao

+0

@Joao這聽起來沒有關係。我想用代碼來創建一個新的問題會更好,這個問題可以證明你所嘗試過的東西。 –

+0

謝謝。張貼http://stackoverflow.com/questions/37213494/angular-2-redirect-in-http-rxjs-catch-callback-causes-typeerror-cannot-read-pro – Joao