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

RxJS中不使用已废弃retryWhen如何实现带延迟的失败重试

RxJS 实现链式调用延迟重试(无废弃API)

retryWhen 标记废弃后,官方原生支持直接通过retry算子的配置项实现延迟重试逻辑,不需要额外封装或使用废弃接口。

你之前直接加delay(2000)不生效的原因很简单:delay会对管道中所有传输的数据做统一延迟,无法区分「正常返回值」和「错误触发的重试」场景,自然达不到失败后等2秒再重试的效果。

符合需求的实现代码

直接替换原有管道中的retry(5)部分即可,其余原有逻辑完全不需要改动:

import { of, switchMap, retry, catchError, timer } from 'rxjs';

of('trigger')
  .pipe(
    switchMap(() => fetchData()),
    retry({
      count: 5, // 最大重试次数
      delay: () => timer(2000) // 每次重试前等待2秒,首次失败即触发第一次等待
    }),
    catchError(() => of(returnThisIfRetriesAreFailed))
  )
  .subscribe(console.log);

逻辑匹配说明

  • 首次请求成功时不会进入重试逻辑,无任何额外延迟
  • 首次请求失败后等待2秒发起第一次重试,后续每次失败都间隔2秒再重试,最多重试5次
  • 所有重试耗尽仍失败时,错误会被后续catchError捕获,返回预设的兜底数据
  • 全程不使用已废弃的retryWhen算子,完全符合RxJS官方最新API规范

可选扩展

如果需要针对不同错误类型做差异化处理,可以在delay配置中加判断,比如客户端参数错误直接抛错不重试:

retry({
  count: 5,
  delay: (err) => {
    // 4xx类客户端错误直接抛出,不做重试
    if (err.status >= 400 && err.status < 500) throw err;
    return timer(2000);
  }
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:09:20