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
相关产品推荐
相关产品推荐

