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

Angular 4使用switchMap丢失与路由器paramMap的订阅,angular,rxjs,angular2-routing,Angular,Rxjs,Angular2 Routing,使用Angular的最新版本,我有一个非常小、简单的应用程序-请参见以下内容: “预测详细信息”组件如下所示: public getForecastData(forecastId) : Observable<any> { return this.http.get<any>('/api/forecasts/' + forecastId + '/data'); } ngOnInit() { this.route.paramMap .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(forecastId):可观察{ 返回这个.http.get('/api/forecast/'+forecastId+'/data'); } 恩戈尼尼特(){ 此.route.paramMap .开关图( 参数=>{ 返回此.getForecastData(params.get('id')) }) }) .订阅((数据)=>{ //这里的业务逻辑 }); 我遇到的问题是,如果getForecastData调用失败(服务器返回500),那么对router paramMap observable的订阅似乎会丢失。我尝试导航到另一个forecast,但没有调用getForecastData方法

我想我需要某种错误处理,但我需要在哪里处理呢?在subscribe中添加错误调用似乎不起作用,除非我需要返回另一个可观察的


这基本上是从Angular网站的教程中改编而来的,但是他们用静态数据返回了一个承诺,并且非常坚持快乐的道路。

可以观察到哪些错误将向上游发出取消订阅的信号,并向下游传播错误。因此,当getForecastData()调用返回错误时,会将其发送到
subscribe
并取消上游订阅。这就是您的外部流(开关映射)停止的原因

如果希望流继续,即使
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();

data=>{//business logic here}),err=>//您的错误
如果您想在错误中再次使用此函数,建议ngOnIt>>调用函数>>错误>>再次执行函数