angular - 从 HttpInterceptor 中的 catchError 返回可观察到的捕获错误会导致错误循环

标签 angular rxjs rxjs6

我有一个简单的拦截器,它可以处理请求并使用 RXJS catchError 捕获任何 http 错误。 catchError 接收到的第二个参数是捕获的可观察对象。在某些情况下,我想返回此错误并让它传播到订阅函数中的错误处理程序。问题是返回捕获的错误会导致无限循环(如示例所示:https://stackblitz.com/edit/angular-u4gakr)

拦截器中的拦截函数,当接收到 HTTP 错误(如 404)时,catchError 卡在一个循环中:

return next.handle(request)
  .pipe(
    catchError((error, caught$) => {
      console.log('Returning caught observable'); 
      return caught$;
    })
  );

我可能对拦截器或 RxJS catchError 有一些误解。有什么建议吗?

最佳答案

原来我需要使用 return throwError(error) 作为返回捕获的可观察对象,或者 of(error) 都未能将其正确返回给订阅函数错误处理程序。

那么最终的代码是:

return next.handle(request)
  .pipe(
    catchError((error) => {
      console.log('Returning caught observable'); 
      return throwError(() => new Error('The Error'));
    })
  );

关于angular - 从 HttpInterceptor 中的 catchError 返回可观察到的捕获错误会导致错误循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51948677/

相关文章:

rxjs - 每当另一个 Observable 发射时跳过来自源的下一次发射的运算符

angular - 如何使用 SystemJS/Angular2 通过 rxjs 访问 Rx.Scheduler.immediate?

typescript - 使用 UMD 构建时如何将 RxJS 与类型定义结合使用?

javascript - Angular mat-select 获取选中的选项数据对象

Angular v8 向组件添加 3rd 方样式

angular - 我如何在不使用共享模块的情况下定义将在 Angular 中的所有延迟加载模块中使用的全局 @pipe() ?

angular - 如何修复拒绝在框架中显示,因为它将 'X-Frame-Options' 设置为 'deny'

angular - 找不到模块 'rxjs-compat/Observable'

RxJS:Observables 之间可重复的竞争

javascript - 即使父源流仍然发出新值,具有合并功能的计时器也会停止发出值