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

时间:2017-08-17 15:10:21

标签: 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时,我收到:

  

错误TypeError:无法读取未定义

的属性'returnCode'

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

我可以做些什么来确保从错误处理程序中捕获subscribe中的错误?

谢谢!

修改

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

1 个答案:

答案 0 :(得分:1)

评论中的描述实际上有点不准确。当源发出错误时,永远不会调用map()运算符的回调,只是发送错误(map()仅适用于next信号,而不是error s )。 "一个或另一个,从来都不是"规则仅适用于errorcomplete信号,而不适用于next信号。当然,您可以有多个next信号。

然后它被catch()抓住并且刚刚重新投入。

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

  2. 服务器可能无法发送正确的状态代码,因此Angular HTTP服务会将其解释为next通知。如果服务器发送了例如404500状态代码,它将自动传播为错误,您不需要做任何事情。