我试图在服务中使用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块吗?
答案 0 :(得分:1)
评论中的描述实际上有点不准确。当源发出错误时,永远不会调用map()
运算符的回调,只是发送错误(map()
仅适用于next
信号,而不是error
s )。 "一个或另一个,从来都不是"规则仅适用于error
和complete
信号,而不适用于next
信号。当然,您可以有多个next
信号。
然后它被catch()
抓住并且刚刚重新投入。
您根本不需要使用catch()
。该错误已作为error
通知传播。
服务器可能无法发送正确的状态代码,因此Angular HTTP服务会将其解释为next
通知。如果服务器发送了例如404
或500
状态代码,它将自动传播为错误,您不需要做任何事情。