【问题标题】:Angular 4 losing subscription with router paramMap using switchMapAngular 4 使用 switchMap 与路由器 paramMap 失去订阅
【发布时间】:2017-09-01 09:32:20
【问题描述】:

使用最新版本的 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?

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

【问题讨论】:

  • data =&gt; {// business logic here}), err =&gt; //your error 如果你想再次使用这个错误建议ngOnIt >> call function>>error>> do function again

标签: angular rxjs angular2-routing


【解决方案1】:

哪个错误将向上游发送unsubscribe 信号并将错误传播到下游的 Observables。因此,当您的 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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 2020-05-08
    相关资源
    最近更新 更多