2017-08-17 56 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期望調用成功和錯誤回調。那不可能發生。 –

相關問題