2017-08-17 57 views
3

我正在尝试利用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块?

+0

您确定服务器返回带有HTTP错误代码(如此> 200)的响应吗? –

+1

看来你已经想通了一切。您的错误回调没有执行,因为您的成功回调被执行。它是一个或另一个,从来都不是。它只是看起来你的map()回调和/或你的成功回调和/或你的后端有一个需要修复的bug。 –

+0

是的,服务器实际上是用状态码200响应,只是不正确的JSON。 – slashp

回答

1

评论中的描述实际上有点不准确。当信源发出错误时,将不会调用回拨到map()运营商的回拨,并且错误只是进一步发送(map()只与next信号,而不是error s)。 “一个或另一个,从不两个”规则仅适用于errorcomplete信号,而不适用于next信号。当然,你可以有多个next信号。

然后它被catch()抓住并刚刚重新排出。

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

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

+0

这完美地回答了我的问题,以及我的另一个问题。我很好奇是否需要使用“catch()”运算符,因为错误是否会传递给订阅事件处理程序。谢谢!! – slashp

+1

@马丁或许你误解了我说的话,或者我没有正确表达自己。发出错误,并调用subscribe方法的错误回调,或者它是一个常规事件,并调用susbscribe方法的成功回调。你不能让两者都被调用相同的事件。这里有一个事件正在发布,OP期望调用成功和错误回调。那不可能发生。 –

相关问题