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

Rxjs retry()操作符未触发重试问题求助

RxJS retry() 不重试的问题及解决办法

你的问题核心在于:simulateHttpRequest()只被调用了一次,生成的Observable在创建时就已经确定了成功或失败的结果。retry(3)的作用是重复订阅同一个Observable,而非重新执行请求逻辑生成新的Observable,所以即使触发重试,结果也和第一次完全一致,看起来就像只执行了一次。

要实现失败时重新发起请求的效果,需要用defer()操作符把请求逻辑包装成Observable工厂,让每次订阅(包括重试时的订阅)都重新执行请求代码:

simulateHttpRequest() {
  const shouldSucceed = Math.random() < 0.1; // 10% chance of success
  if (shouldSucceed) {
    return of('Random response');
  } else {
    return throwError(() => new Error('Random error'));
  }
}

makeCall() {
  defer(() => this.simulateHttpRequest()).pipe(
    retry(3) // 现在会最多重试3次,每次都重新执行请求逻辑
  ).subscribe({
    next: o => console.log(o),
    error: o => console.error(o) // 只有4次请求都失败时才会触发
  });
}

关键说明

  • defer()接收一个返回Observable的函数,每次订阅它生成的Observable时,都会调用传入的函数,生成全新的Observable实例。
  • 这样retry(3)触发重试时,会重新调用simulateHttpRequest(),重新生成随机的成功/失败结果,完全符合你期望的最多重试3次的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:58:14