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

如何用RxJS优雅实现请求完成/失败后延迟10秒重复发起的逻辑?

更优雅的RxJS实现方案:请求完成后延迟重试(无限循环)

你的需求完全可以通过RxJS的操作符组合来更优雅地实现,不需要手动维护Subject来触发重试。核心思路是利用repeatWhen和delay操作符,让请求在完成(无论成功或失败)后自动等待指定时间,再重新发起,同时保证不会出现重叠的请求。

优化后的代码实现

import { EMPTY, Subscription } from 'rxjs';
import { tap, catchError, repeatWhen, delay } from 'rxjs/operators';

// 组件内定义订阅对象,用于销毁时取消订阅
private refreshSubscription?: Subscription;

ngOnInit(): void {
  this.refreshSubscription = this.startAutoApplicationRefresh();
}

ngOnDestroy(): void {
  // 组件销毁时停止刷新,避免内存泄漏
  this.refreshSubscription?.unsubscribe();
}

private startAutoApplicationRefresh(): Subscription {
  return this.api.getApplications()
    .pipe(
      // 请求成功时更新应用列表
      tap(applications => this.updateApplications(applications)),
      // 捕获请求错误,避免流中断,同时可添加错误日志等处理
      catchError(error => {
        console.error('获取应用列表失败:', error);
        return EMPTY; // 返回空流,保证后续重试逻辑继续执行
      }),
      // 当当前请求完成(成功/失败)后,等待10秒再重复整个流
      repeatWhen(completed$ => completed$.pipe(delay(10000)))
    )
    .subscribe();
}

方案优势

  • 去掉冗余状态管理:不再需要手动维护Subject来触发重试,减少了代码复杂度和潜在的状态错误
  • 逻辑更清晰:通过RxJS操作符的链式调用,直观表达“请求→处理结果→出错处理→延迟→重复”的完整流程
  • 自动保证请求不重叠:只有当前请求完全完成(成功或失败)后,才会进入延迟阶段,绝不会在请求未完成时发起新请求
  • 错误容错性强:通过catchError和EMPTY确保单个请求失败不会中断整个刷新循环,依然会按计划重试

额外说明

因为getApplications()是Swagger生成的、基于HttpClient的Observable,只有订阅它才会发起请求,这个方案完全适配这一点——每次repeatWhen触发时,都会重新订阅源Observable,也就是重新向服务器发起请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:59:32