2017-09-01 50 views
2

使用的角最新版本我有一個非常小的,簡單的應用程序路由器paramMap - 見下:角4輸球訂閱使用switchMap

simple app

預測細節分量如下所示:

public getForecastData(forecastId) : Observable<any> { 
    return this.http.get<any>('/api/forecasts/' + forecastId + '/data'); 
} 

ngOnInit() { 
    this.route.paramMap 
    .switchMap(
     params => { 
     return this.getForecastData(params.get('id')) 
     }) 
}) 
.subscribe((data) => { 
    // business logic here 
}); 

我遇到的問題是,如果getForecastData調用失敗(服務器返回500),路由器paramMap observable的訂閱似乎丟失。我嘗試導航到不同的預測,並且getForecastData方法未被調用。

我想我需要某種錯誤處理,但我需要在哪裏處理?在訂閱內部添加錯誤調用似乎不起作用,除非我需要返回另一個Observable?

這基本上是從Angular網站上的教程改編的,但是他們用靜態數據返回一個Promise,並且非常堅持快樂的路徑。

+0

'數據=> {//業務邏輯在這裏}), ERR => //你error' 如果你想在錯誤再次使用這個建議ngOnIt> >調用函數>>錯誤>>再次執行功能 – Swoox

回答

1

觀察結果錯誤將向上遊發送信號unsubscribe並向下遊傳播錯誤。所以當你的getForecastData()調用返回一個錯誤時,這個錯誤會被髮送到你的subscribe並且取消訂閱上游。這就是你的外流(switchMap)停止的原因。

如果您希望您的數據流繼續運行,即使getForecastData引發錯誤,您也需要捕獲它並返回一個常規值。例如:

this.route.paramMap 
.switchMap((params) => { 
    return this.getForecastData(params.get('id') 
    .do(null, err => console.log('getForecastData error: ' + err.message)) 
    .catch(_ => Rx.Observable.empty()); 
}) 
.subscribe(); 

In this talk by Ben Lesh errors & handling them is explained in detail.