Angular 4使用switchMap丢失了使用路由器paramMap的订阅

时间:2017-09-01 09:32:21

标签: angular rxjs angular2-routing

使用最新版本的Angular我有一个非常小的简单应用程序 - 见下文:

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,否则在subscribe中添加错误调用似乎不起作用?

这基本上是对Angular网站上的教程的改编,但是他们正在返回一个带有静态数据的Promise,并且非常坚持快乐的道路。

1 个答案:

答案 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.