2017-03-15 74 views
1

我知道這個問題看起來很簡單,但是關於Observables和錯誤處理的網絡資源並不是很好(或者我只是在搜索時很糟糕)。不要在錯誤後關閉Observable

我有一個返回可觀測的響應,這些響應可以包含數據或錯誤消息的HTTP請求。如果它包含我想提取它並解析它的數據,如果它包含錯誤消息,我想跳過所有其他運算符(關於解析)並執行訂閱服務器中的錯誤函數。

我能做到這一切的事情拋出Error:

http.get(...). 
... 
.do(res=>{ 
    if(res.error) throw new Error(res.error.message); 
    return res; 
}) 

和它的作品,它跳過所有的運營商,它執行的誤差函數。問題是,在出錯後,訂戶停止並且不再接受數據。

如果我分析錯誤後,認購人,我注意到性能關閉isStopped設置爲真正兩者。我想要阻止這一點,我想在錯誤發生後保持Observable活動狀態。我該怎麼做?

謝謝

+0

訂閱後不建議使它們處於活動狀態 – Aravind

+0

看起來您只需要使用'catch()'運算符並返回'Observable.empty()'... – martin

回答

1

如前面提到的答案,這是標準的行爲,由Rxjs可觀的合同保證。如果你想逃避合同,你可以使用materialize你的來源,在這種情況下,你不會處理通過你的觀測數據流的消息,而是處理元消息(稱爲通知,你期待的三種類型中的nexterror,complete)。元信息沒有任何合同,這會給您造成負擔以創建錯誤,並手動完成郵件,或使用dematerialize返回到正常行爲。一般而言,可觀察數據對於數據流來說是很好的,而控制流通常是艱鉅的(跳躍,循環,條件分支等)。

請參閱Notification文檔:http://reactivex.io/rxjs/class/es6/Notification.js~Notification.html

materialize文檔瀏覽:http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-materialize

所以,如果你想處理錯誤不停止你的源可觀察到的,你可以做這樣的事情:

function process(source, success, error) { 
    return source.materialize() 
    .map(function(notification){ 
     const value = notification.value; // that is the actual message data 
     if (notification.kind === 'N') { 
     // that is a next message, we keep it a next message 
     return Notification.createNext(success(value)); 
     } 
     if (notification.kind === 'E') { 
     // that is a error message, we turned into a next message 
     return Notification.createNext(error(value)); 
     } 
     if (notification.kind === 'C') { 
     // that is a completed message, we keep it a completed message 
     return Notification.createComplete(); 
     } 
    }) 
    .dematerialize() 
} 

然後,您可以使用該功能您的源代碼可見並將成功和錯誤函數傳遞給流處理值。正如您所看到的,此處的技巧是將錯誤消息轉換爲正常消息,然後恢復正常。

這是從我的頭後面完成,所以未經測試,所以讓我更新,如果這對你有幫助。我在Rxjs v4上多次使用了類似的技術,我相信它應該直接轉化爲Rxjs v5。

2

你在問什麼是字面上打破Observable的合同。 Observable被定義爲0或更多值的生產者,並且如果生產者完成了生成值,它將在其觀察者上調用complete處理程序,並且如果有錯誤,它將調用error

但是一旦它呼叫completeerror,它的合同就是它再也不會給觀察者打電話next

有辦法解決這個問題 - 通過正確組合你的observables,你可以用一個新的observable恢復你的流。但沒有額外的背景,很難進一步指導您。基本思想是在可觀察鏈中使用.catch運算符來創建一個新的可觀察錯誤,但是再次需要額外的上下文來提供示例。

編輯:

由於@cartant有益補充,see the observable contract

+1

http://reactivex.io/documentation/ contract.html – cartant