有了承諾,我們可以使用變體.then
在發生錯誤時分割鏈。下面是使用fetch
在RxJS中發生錯誤可分割
fetch('http://website.com').then(
// Perform some logic
(response) => response.json().then(({ answer }) => `Your answer: ${answer}`),
// Skip json parsing when an error occurs
(error) => 'An error occurred :(',
).then(console.log);
一個例子這讓我跳過響應處理邏輯,只會在原有取聲明中提出的錯誤迴應。東西RxJS相似可能是這樣的:
Observable.fromPromise(fetch('http://website.com'))
// if I put .catch here, the result will be piped into flatMap and map
.flatMap(response => response.json())
.map(({ answer }) => `Your answer: ${answer}`)
// if I put .catch here, errors thrown in flatMap and map will also be caught
.subscribe(console.log);
如上代碼狀態的評論,我不能簡單地把一個catch運營商,因爲它不具有相同的行爲,我的諾言鏈。
我知道我可以通過自定義操作符來獲得它,包括實現或合併一個錯誤捕捉observable與這個,但這一切似乎是非常重大的矯枉過正。有沒有簡單的方法來實現承諾鏈行爲?
我想區分這兩種錯誤的原因是因爲我可以合理地恢復,或者從'fetch'中的錯誤(例如您的網絡出現問題)提供某種反饋。 如果在flatMap或map中發生錯誤,可能是我自己的錯誤,所以我想讓錯誤傳播給訂閱者。 – Pinpickle
我喜歡你的解決方案,但我的目標是讓結果(在這種情況下,來自錯誤或解析JSON的字符串)成爲相同可觀察部分。你會建議合併這兩個嗎? – Pinpickle
比我可能在'Observable.fromPromise()'後面使用'catch()'並且用我自己的錯誤類('catch()')包裝錯誤,也可以用你自己的錯誤類重新拋出錯誤爲'error信號)。後來在觀察者中,我可以檢查錯誤是typeof還是實現了某個類。這意味着我可以檢查錯誤是否發生在'fromPromise'中,並且被catch()或者來自例如catch。 'map'並且是一個常規錯誤。也許看看'retryWhen()'操作符也會捕獲錯誤,但讓我們根據自己的通知自動重新訂閱... – martin