Angular 4 使用 switchMap 失去对路由器 paramMap 的订阅
Angular 4 losing subscription with router paramMap using switchMap
使用最新版本 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 调用失败(服务器 returns 500),对路由器 paramMap observable 的订阅似乎会丢失。我尝试导航到不同的预测,但未调用 getForecastData 方法。
我想我需要某种错误处理,但我需要在哪里处理呢?在订阅中添加错误调用似乎不起作用,除非我需要返回另一个 Observable?
这基本上是对 Angular 网站上的教程的改编,但是他们返回一个带有静态数据的 Promise,并且非常坚持快乐的道路。
错误将向 unsubscribe
上游发出信号并将错误传播到下游的 Observable。因此,当您的 getForecastData() 调用 return 时出现错误,这将发送到您的 subscribe
并取消订阅上游。这就是你的外流(switchMap
)停止的原因。
如果您希望即使 getForecastData
抛出错误也能继续播放,您需要捕获它并 return 一个常规值。例如:
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.
使用最新版本 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 调用失败(服务器 returns 500),对路由器 paramMap observable 的订阅似乎会丢失。我尝试导航到不同的预测,但未调用 getForecastData 方法。
我想我需要某种错误处理,但我需要在哪里处理呢?在订阅中添加错误调用似乎不起作用,除非我需要返回另一个 Observable?
这基本上是对 Angular 网站上的教程的改编,但是他们返回一个带有静态数据的 Promise,并且非常坚持快乐的道路。
错误将向 unsubscribe
上游发出信号并将错误传播到下游的 Observable。因此,当您的 getForecastData() 调用 return 时出现错误,这将发送到您的 subscribe
并取消订阅上游。这就是你的外流(switchMap
)停止的原因。
如果您希望即使 getForecastData
抛出错误也能继续播放,您需要捕获它并 return 一个常规值。例如:
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.