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

如何在RXJS与Angular中将数组值逐个传入timer创建函数

解决RxJS重试按指定延迟数组依次等待的问题

你的核心问题在于retry的delay函数每次重试都会被调用,但你提前创建了一个包含所有延迟的Observable,导致每次重试都会从头订阅这个流,所以始终使用第一个延迟值。

RxJS的retry操作符的delay配置支持传入一个函数,该函数会接收当前的retryCount(重试次数,从0开始计数),你可以利用这个参数直接从延迟数组中取出对应索引的延迟值,返回对应的timer即可。

修正后的代码实现

private ob$ = of(1);

private retryConfig: {
  matcher: () => void;
  retryWaits: number[];
};

constructor() {}

private setRetryConfig(): RetryConfig {
  this.retryConfig = {
    matcher: () => {},
    retryWaits: [3000, 4000, 6000],
  };

  return {
    count: this.retryConfig.retryWaits.length,
    // 利用retryCount获取对应索引的延迟值
    delay: (error, retryCount) => {
      const delayMs = this.retryConfig.retryWaits[retryCount];
      console.log(`第${retryCount+1}次重试,延迟${delayMs}ms`);
      return timer(delayMs);
    },
  };
}

ngOnInit(): void {
  this.ob$
    .pipe(
      tap(() => {
        throw new Error('error'); // 简化错误抛出写法
      }),
      retry(this.setRetryConfig())
    )
    .subscribe({
      next: (x) => {
        if (x) {
          throw new Error('error');
        }
      },
      error: (err) => console.log('最终重试失败:', err)
    });
}

关键说明

  • 移除多余的catchError:如果在retry之前添加catchError,错误会被直接捕获并进入处理逻辑,retry将失去触发条件。
  • 直接在delay函数中返回对应延迟的timer:每次重试时retryCount递增(0、1、2),对应取数组中的3000、4000、6000,实现依次递增的延迟重试。
  • 简化错误抛出逻辑:throw new Error()可直接使用,无需嵌套throwError(() => ...),除非你需要返回Observable类型的错误流。

这样修改后,重试时就会按照你期望的顺序依次使用数组中的延迟值了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:10:47