【问题标题】:What is the proper way to handle errors in RxJS?在 RxJS 中处理错误的正确方法是什么?
【发布时间】:2021-12-16 11:53:17
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: angular typescript error-handling rxjs


    【解决方案1】:

    使用订阅错误回调处理错误可以完成您的工作,但如果您想在发生错误时发出替代值,它会受到限制。 (替换值)

    例如,假设您正在等待您的 observable 发出用户列表,但您想在发生错误时获得一个空数组,您不能在 subscribe 调用中的错误回调中执行此操作,但您可以使用 catchError

    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 []
    

    【讨论】:

      【解决方案2】:

      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 操作员使用错误处理程序订阅输入流,监视和处理错误。)


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

      对于无法完全折叠的复杂流,请使用catchError

      【讨论】:

        猜你喜欢
        • 2020-12-02
        • 1970-01-01
        • 1970-01-01
        • 2017-09-20
        • 1970-01-01
        • 1970-01-01
        • 2010-11-04
        • 2018-09-21
        • 1970-01-01
        相关资源
        最近更新 更多