为什么我的RxJS订阅错误处理程序不会触发?
我正在尝试利用Angular 2的HTTP方法在服务中工作正常,直到服务器返回无效响应。下面是从我的服务方法代码:为什么我的RxJS订阅错误处理程序不会触发?
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
运算符返回未定义的,因此,试图从我的订阅方法中访问response.returnCode
的时候,我收到:
ERROR TypeError: Cannot read property 'returnCode' of undefined
而异步代码只是停止执行......订阅上的错误函数永远不会被调用(编辑:因为服务器正确响应和映射工作正常,只是对错误的JSON格式)。
我该怎么做才能确保订阅中的错误是从我的错误处理程序中捕获的?
谢谢!
编辑
在评论中进一步讨论这之后,就是我真正问这里究竟是如何从我的“订阅”回调中捕获错误?我只需要使用try/catch块?
评论中的描述实际上有点不准确。当信源发出错误时,将不会调用回拨到map()
运营商的回拨,并且错误只是进一步发送(map()
只与next
信号,而不是error
s)。 “一个或另一个,从不两个”规则仅适用于error
和complete
信号,而不适用于next
信号。当然,你可以有多个next
信号。
然后它被catch()
抓住并刚刚重新排出。
根本不需要使用
catch()
。该错误已传播为error
通知。服务器可能不会发送正确的状态码,因此Angular HTTP服务将它们解释为
next
通知。如果服务器发送例如404
或500
状态码,它将自动传播为错误,您不需要执行任何操作。
这完美地回答了我的问题,以及我的另一个问题。我很好奇是否需要使用“catch()”运算符,因为错误是否会传递给订阅事件处理程序。谢谢!! – slashp
@马丁或许你误解了我说的话,或者我没有正确表达自己。发出错误,并调用subscribe方法的错误回调,或者它是一个常规事件,并调用susbscribe方法的成功回调。你不能让两者都被调用相同的事件。这里有一个事件正在发布,OP期望调用成功和错误回调。那不可能发生。 –
您确定服务器返回带有HTTP错误代码(如此> 200)的响应吗? –
看来你已经想通了一切。您的错误回调没有执行,因为您的成功回调被执行。它是一个或另一个,从来都不是。它只是看起来你的map()回调和/或你的成功回调和/或你的后端有一个需要修复的bug。 –
是的,服务器实际上是用状态码200响应,只是不正确的JSON。 – slashp