angular - 为什么我的 RxJS 订阅错误处理程序没有触发?

标签 angular rxjs

我正在尝试在服务中使用 Angular 2 的 HTTP 方法,该方法在服务器返回无效响应之前工作正常。这是我的服务的方法代码:

getCalcCode(request: CalculatorRequest) {
  this.http.post(this._serviceUrl, JSON.stringify(request), this.options)
    .map((response: Response) => response.json().returnData as CalculatorResponse)
    .catch((error) => {
      return Observable.throw(error);
    })
    .subscribe((response: CalculatorResponse) => {
      if (response.returnCode === '000') {
        console.log('Code is zero!');
      }
    }, (error) => {
      console.error('Error: : ', error);
    });
}

当服务器返回无效响应时,Map 运算符返回 undefined,因此,当尝试从我的订阅方法中访问 response.returnCode 时,我收到:

ERROR TypeError: Cannot read property 'returnCode' of undefined

并且异步代码只是停止执行...永远不会调用订阅错误函数(编辑:因为服务器响应正确并且映射工作正常,只是到错误的 JSON 格式 ).

我该怎么做才能确保从我的错误处理程序中捕获订阅中的错误?

谢谢!

编辑

在评论中进一步讨论之后,我真正想问的是如何从我的“订阅”回调中捕获错误?我是否只需要使用 try/catch block ?

最佳答案

评论中的描述其实有点不准确。当源发出错误时,永远不会调用对 map() 运算符的回调,而只是进一步发送错误(map() 仅适用于 next 信号,而不是 错误)。 “一个或另一个,决不能同时使用”规则仅适用于 errorcomplete 信号,不适用于 next 信号。当然,您可以有多个 next 信号。

然后它被 catch() 捕获并重新抛出。

  1. 您根本不需要为此使用 catch()。该错误已作为 error 通知传播。

  2. 服务器可能没有发送正确的状态代码,因此 Angular HTTP 服务将它们解释为 next 通知。如果服务器发送例如 404500 状态代码,它将自动传播为错误,您无需执行任何操作。

关于angular - 为什么我的 RxJS 订阅错误处理程序没有触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45738840/

相关文章:

angular - MatSort 显示了箭头,但实际上并没有对数据进行排序

angular - 我可以通过@HostBinding 之外的其他方式访问主机绑定(bind)吗?

angular - 通过 Angular 应用程序收听 Firebase 云消息传递时出现问题

类型 'url' 上不存在 Angular 属性 'ActivationEnd'

javascript - Observable 完成后返回单个对象

javascript - 自定义验证器在 Angular 2 中重置 react 形式时抛出错误

Angular 5 在运行时使用 Angular CLI 加载语言环境

angular - 我们是否需要取消订阅已完成/出错的可观察对象?

javascript - 如何在 Observable 方法中顺序调用异步函数?

typescript - typescript 中的Java方法引用运算符(双冒号)等效