Angular中基于特定成功响应(非错误)重发HTTP请求
基于RxJS实现请求成功后条件重试的方案
针对你需要在API请求成功但响应满足特定条件时重发请求的场景,以下是两种实用的RxJS实现方案:
方案一:使用repeatWhen操作符
repeatWhen用于在源Observable完成时决定是否重复订阅,适合无参数变化的重试场景:
import { EMPTY, timer } from 'rxjs'; import { tap, repeatWhen, switchMap } from 'rxjs/operators'; import { http } from './your-http-service'; // 替换为你的HTTP服务 // 定义API请求Observable const fetchData = () => http.get('/target-api'); let lastResponse: unknown; fetchData() .pipe( // 保存每次请求的响应结果,用于重试判断 tap(res => lastResponse = res), repeatWhen(notifications => notifications.pipe( switchMap(() => { // 自定义重试条件:比如响应中存在needRetry且为true if (lastResponse?.needRetry) { // 延迟1秒后重试,可根据需求调整间隔 return timer(1000); } else { // 不满足条件,终止重试流 return EMPTY; } }) ) ) ) .subscribe({ next: finalRes => console.log('最终响应:', finalRes), error: err => console.error('请求失败:', err) });
方案二:使用expand操作符(更灵活)
expand支持递归映射Observable,适合需要调整请求参数或跟踪重试次数的场景:
import { EMPTY, timer } from 'rxjs'; import { expand, last, switchMap } from 'rxjs/operators'; import { http } from './your-http-service'; const fetchData = () => http.get('/target-api'); fetchData() .pipe( // expand的第二个参数是重试次数计数器,从0开始 expand((res, retryCount) => { // 限制最多重试3次,同时满足响应条件 if (res?.needRetry && retryCount < 3) { return timer(1000).pipe( // 若需要调整请求参数,可在此处修改fetchData的调用 switchMap(() => fetchData()) ); } // 终止递归 return EMPTY; }), // 只获取最后一次满足终止条件的响应 last() ) .subscribe({ next: finalRes => console.log('最终响应:', finalRes), error: err => console.error('请求失败:', err) });
关键注意事项
- 限制重试次数:务必添加重试次数上限,避免无限循环请求服务器;
- 指数退避策略:可将固定延迟改为动态递增(如1s→2s→4s),降低服务器压力;
- 参数动态调整:若每次重试需要修改请求参数(如携带重试标记),优先选择
expand方案。
内容的提问来源于stack exchange,提问作者vibhu
相关产品推荐
相关产品推荐

