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

RxJS中retryWhen已弃用,如何替换结合bufferWhen的retryWhen?

替代RxJS已弃用的retryWhen操作符方案

在RxJS 7及以上版本中,retryWhen已被官方弃用,推荐使用带有配置项的retry操作符来实现自定义重试逻辑,完全可以替代你原代码中retryWhen结合bufferWhen的功能。

核心思路

你原代码的逻辑是:当webBusy为true时抛出错误,等待doNextAct$发出信号后触发重试。新版retry的delay配置支持传入一个函数,该函数接收错误并返回一个Observable——当这个Observable发出值时,就会触发重试,正好匹配你等待doNextAct$信号的需求。

改写后的代码

of(1)
  .pipe(
    tap(() => {
      if (this.webBusy) {
        throw 2;
      }
    }),
    // 用带配置的retry替代retryWhen
    retry({
      delay: (err) => {
        console.log(`Nav ${err} WebBusy`);
        // 等待doNextAct$发出值后触发重试
        return this.doNextAct$;
      },
      // 可选:限制重试次数,不写则无限重试
      // count: Infinity,
      // 可选:仅在特定错误时重试,避免无关错误触发重试
      shouldRetry: (err) => err === 2
    }),
    switchMap((resp: SvcResponse) => {
      this.webBusy = true;
      return api.doAct(navData);
    }),
    tap((resp: SvcResponse) => {
      this.webBusy = false;
      this.doNextAct$.next(1);
    }),
  ).subscribe();

关于bufferWhen的替代

如果你确实需要缓冲多个错误,直到doNextAct$发出后再一次性重试(原代码中bufferWhen的逻辑),可以在delay函数内嵌套bufferWhen:

retry({
  delay: (err) => {
    console.log(`Nav ${err} WebBusy`);
    return of(err).pipe(
      bufferWhen(() => this.doNextAct$),
      map(() => null) // 转换为可触发重试的信号
    );
  }
})

不过大多数场景下,第一种直接返回doNextAct$的写法已经能满足需求,更简洁高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:20:48