使用最新版本的Angular我有一个非常小的简单应用程序 - 见下文:
预测明细组件如下所示:
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,否则在subscribe中添加错误调用似乎不起作用?
这基本上是对Angular网站上的教程的改编,但是他们正在返回一个带有静态数据的Promise,并且非常坚持快乐的道路。
答案 0 :(得分:4)
Observables哪个错误将向上游发出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.