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 中的错误处理程序在流因错误而崩溃时被调用。 (注意:实际上catchError 操作员使用错误处理程序订阅输入流,监视和处理错误。)
结论:
对于可能由于错误而折叠的简单流,我们可以 subscribe 到带有错误处理程序的流。
对于无法完全折叠的复杂流,请使用catchError。