angular - 在 RxJS 中处理错误的正确方法是什么?

标签 angular typescript error-handling rxjs

RxJS 提供了很多处理错误的方法,我很难理解它们中的每一个以及它们的使用位置。我对 RxJS 了解得越多,我就越了解它。

如果我使用管道,则会出现 catchError。

如果我在管道内使用水龙头,则有可选的错误参数。

如果我使用订阅,还有可选的错误参数。

我想在哪里使用一个错误处理程序而不是另一个?可选错误参数的用例是什么?如果我使用了tap的error参数,我还需要使用catchError吗?如果我有catchError,我还需要使用订阅错误参数吗?

我想更好地理解每个错误处理程序,以及进行错误处理的正确方法是什么。

最佳答案

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 能够对所有情况执行副作用:nexterrorcomplete .

actions$.pipe(
  tap(console.log, console.error, () => console.log('complete')),
  // or
  tap({
    next: console.log,
    error: console.error,
    complete: console.log('complete'),
  }),
)

subscribe 中的错误处理程序在流因错误而崩溃时被调用。 (注意:实际上 catchError 操作符使用错误处理程序订阅输入流,监视和处理错误。)


结论: 对于可能由于错误而折叠的简单流,我们可以订阅到带有错误处理程序的流。

对于不能完全折叠的复杂流,使用 catchError

关于angular - 在 RxJS 中处理错误的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69802194/

相关文章:

javascript - 无法使用 Angular 设置在列表组中单击按钮时选择的单选按钮值

javascript - 有没有一种优雅的方式使用 TypeORM 在 OneToMany 关系数组中查找一条记录并将其分配给实体中的另一个字段?

r - 为什么我使用naiveBayes函数会得到未定义的列?

python - 如何在excepts子句中使用程序包中的自定义异常?

c++ - 处理项目集合的设计问题时出错

Angular 7 react 形式如何获取选定值的文本而不是下拉列表形式控件中的值

java - 来自 jsr310 的 LocalDateTimeDeserializer 是否正确反序列化祖鲁日期?

javascript - 如何将服务注入(inject)到类中,然后用它扩展组件?

typescript - angular2-google-maps 标记的点击事件

reactjs - 如何在元素 className 中执行三元运算