我正在尝试在服务中使用 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
信号,而不是 错误
)。 “一个或另一个,决不能同时使用”规则仅适用于 error
和 complete
信号,不适用于 next
信号。当然,您可以有多个 next
信号。
然后它被 catch()
捕获并重新抛出。
您根本不需要为此使用
catch()
。该错误已作为error
通知传播。服务器可能没有发送正确的状态代码,因此 Angular HTTP 服务将它们解释为
next
通知。如果服务器发送例如404
或500
状态代码,它将自动传播为错误,您无需执行任何操作。
关于angular - 为什么我的 RxJS 订阅错误处理程序没有触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45738840/