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

NgRx Effect中如何替换已废弃的RxJS retryWhen操作符

retryWhen 官方替代方案

RxJS 7+ 版本中,已标记废弃的retryWhen官方推荐直接使用增强后的retry操作符替代,通过传入配置对象即可实现完全等价的自定义重试逻辑,无需额外组合复杂操作符。

逻辑对齐说明

修改后的代码和原有逻辑1:1匹配:

  • 派发signIn触发动作后,Effect接收参数发起HTTP POST请求
  • 仅当请求返回504状态码时触发重试,其余错误直接派发失败动作,不进入重试流程
  • 每次重试间隔4秒,最多重试4次
  • 请求正常响应时派发成功动作

修改后的完整代码

authSignIn$ = createEffect(() => this.actions$.pipe(
    ofType(authActions.signInStart),
    exhaustMap(action => this.http
      .post<responseModel.SignInResponse>(`${environment.baseUrl}/${authBaseUrl}/${ApiPaths.singIn}`, {
        codF: action.username,
        password: action.password
      })
      .pipe(
        map((response) => authActions.signInSuccess({user: response.accountInfo, token: response.token})),
        catchError((error: HttpErrorResponse) => {
          if (error.status === 504) {
            return throwError(() => error);
          }
          return of(authActions.signInFail({error: error.message}))
        }),
        // 替换废弃的retryWhen,使用官方标准retry配置写法
        retry({
          count: 4,
          delay: (errors) => errors.pipe(delay(4000))
        })
      )
    )
  ));

替换点说明

retry的对象配置完全覆盖原retryWhen的所有能力:

  • count参数:等价于原逻辑中take(4)的作用,指定最大重试次数
  • delay参数:接收一个返回Observable的函数,入参是错误流,和原retryWhen的入参逻辑完全一致,此处传入delay(4000)即可实现每次重试前等待4秒的效果,你也可以在这个函数中扩展逻辑,比如针对不同错误类型决定是否继续重试、动态调整重试间隔等。

如果4次重试全部耗尽仍返回504错误,流会抛出最终错误,你可以根据业务需求补充对应错误捕获逻辑,该行为和原retryWhen实现完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:27:14