RxJS 提供了很多處理錯誤的方法,我很難理解它們中的每一個以及它們的使用位置。我對 RxJS 了解得越多,對它的了解就越少。
如果我使用的是管道,則會出現 catchError。
如果我在管道內使用 tap,則有可選的錯誤引數。
如果我使用訂閱,還有可選的錯誤引數。
我想在哪里使用一個錯誤處理程式而不是另一個?可選錯誤引數的用例是什么?如果我使用了 tap 的 error 引數,我還需要使用 catchError 嗎?如果我有 catchError,我還需要使用 subscribes 錯誤引數嗎?
我想更好地理解每個錯誤處理程式,以及進行錯誤處理的正確方法是什么。
uj5u.com熱心網友回復:
使用訂閱錯誤回呼處理錯誤可以完成您的作業,但如果您想在發生錯誤時發出替代值,它會受到限制。(替換值)
例如,假設您正在等待您的 observable 發出用戶串列,但您想在出現錯誤時獲得一個空陣列,您不能在 subscribe 呼叫中的錯誤回呼中這樣做,但您可以使用捕獲錯誤
getUsers$.pipe(
catchError(error => of([]))
)
您使用多個 catchError 運算子拋出錯誤并添加替換值
getUsers$.pipe(
catchError(error => {
return throwError(error);
}),
catchError(error => {
return of([]);
})
).subscribe(
users=> console.log('users', users),
err => console.log('Error', err),
)
如果拋出的錯誤永遠不會到達訂閱處理程式函式,您將在控制臺日志中看到它
users []
uj5u.com熱心網友回復:
RxJS 流的設計方式是錯誤導致整個流崩潰。為了防止這種行為,RxJS 提供了一個catchError運算子。它只是捕獲一個錯誤;catchError 的輸入流折疊,但 catchError 的輸出流被保留(如果 catchError 也沒有拋出錯誤)。
示例:處理的 API 錯誤
actions$.pipe(
filter(action => action.type === 'fetchData'),
mergeMap(() => fetchData().pipe(
map(data => ({ type: 'dataFetchSuccess', data })
catchError(error => of('dataFetchError'))
))
)
注意:當fetchData失敗時,actions$ 流不會失敗并且能夠處理下一個值并再次獲取資料。
運算子tap旨在用于副作用,它對流沒有影響。換句話說,它不會以任何方式改變流。
示例:運算子tap能夠對所有情況執行副作用:next、error和complete。
actions$.pipe(
tap(console.log, console.error, () => console.log('complete')),
// or
tap({
next: console.log,
error: console.error,
complete: console.log('complete'),
}),
)
subscribe如果流因錯誤而崩潰,則呼叫錯誤處理程式 in 。(注意:實際上,catchError操作員使用錯誤處理程式訂閱輸入流,監視并處理錯誤。)
結論:對于可能由于錯誤而折疊的簡單流,我們可以subscribe使用錯誤處理程式處理流。
使用catchError了不能被完全毀壞并發流。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/345354.html
