2017-09-01 44 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.