You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将错误抛至外层catchError?RxJS重试逻辑实现问询

解决RxJS审批流程的错误重试问题

你的问题核心是当前approveId的catchError吞掉了错误,导致外层的retry(1)根本感知不到错误发生,自然不会触发重试逻辑。

要实现需求,你需要在approveId的catchError里重新抛出错误,而不是返回of(null)。这样错误会冒泡到外层的管道中,触发retry(1),重试失败后再进入外层的catchError打印失败消息。

修正后的approveId代码

import { throwError } from 'rxjs'; // 记得导入throwError

approveId(id: string) {
    return this.httpService.approveId(id).pipe( // 补上return,外层才能拿到流
      first(),
      tap(() => {
        console.log('Success approved');
      }),
      catchError((error) => {
        // 重新抛出错误,让外层管道捕获并触发重试
        return throwError(() => error);
      })
    );
}

关键细节说明

  1. 必须返回Observable:原代码的approveId方法没有返回流,外层switchMap根本接收不到任何数据,这是基础错误,必须补上return。
  2. throwError的作用:它会创建一个发出错误通知的Observable,让外层switchMap把错误传递到上层管道,从而触发retry(1)逻辑。
  3. 重试流程:第一次审批失败时,retry(1)会重新执行整个load()流——重新调用getId()获取新ID,再发起审批。如果第二次审批仍失败,就会进入外层catchError,打印Approve was failed。

另外注意:load()方法里的Observable需要订阅才会执行,建议在方法末尾加上.subscribe();

内容的提问来源于stack exchange,提问作者Toxa26

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 16:37:44