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

Angular5 HTTP.get重试失败后如何抛出含状态码的最后错误?

Angular 5 HTTP Get 重试后抛出最后一次错误的解决方案

我来帮你搞定这个问题!在Angular 5里实现带详细错误抛出的重试逻辑,retryWhen操作符可比简单的retry()好用多了——它能让你精准控制重试规则,还能在重试耗尽时直接抛出最后一次的原始错误(包含状态码、响应体等所有细节)。

核心思路

你之前用take()加concat(Observable.throw({}))的方式之所以拿不到错误详情,是因为你抛出的是一个自定义的空对象,而非重试过程中捕获到的最后一次真实错误。retryWhen允许我们在重试计数耗尽时,直接抛出当前的错误实例,完美保留所有错误信息。

完整代码示例

下面是针对你的需求写的代码,会在遇到500错误时最多重试5次,5次都失败后抛出最后一次的完整错误:

import { Observable } from 'rxjs/Observable';
// 导入需要的RxJS操作符(Angular 5对应RxJS 5.x,需手动导入)
import 'rxjs/add/operator/retryWhen';
import 'rxjs/add/operator/scan';
import 'rxjs/add/operator/delay';

// 你的HTTP请求逻辑
this.http.get('你的接口URL')
  .retryWhen(errors => {
    return errors
      // scan用来计数重试次数,初始值为0
      .scan((retryCount, currentError) => {
        // 可选:如果只想要针对500错误重试,加这个判断
        if (currentError.status !== 500) {
          throw currentError; // 非500错误直接抛出,不重试
        }

        // 重试次数达到5次时,抛出当前错误
        if (retryCount >= 4) { // 因为初始是0,第5次尝试对应计数4
          throw currentError;
        }

        // 计数加1,继续重试
        return retryCount + 1;
      }, 0)
      // 可选:每次重试前延迟1秒(避免频繁请求),不需要可以删掉这行
      .delay(1000);
  })
  .subscribe(
    responseData => {
      console.log('请求成功:', responseData);
      // 处理成功数据
    },
    finalError => {
      console.error('最终错误详情:', finalError.status, finalError.message);
      // 这里能拿到最后一次错误的状态码、响应体等所有信息
    }
  );

关键代码解释

  1. retryWhen:接收一个处理错误流的函数,我们可以在这里定义重试规则。
  2. scan操作符:用来累计重试次数,每次错误进来时更新计数。当计数达到设定的最大值(这里是4,对应5次尝试:1次初始请求+4次重试),就直接抛出当前的currentError——这个就是最后一次失败的真实错误对象,包含你需要的状态码、响应头等信息。
  3. 可选的错误过滤:如果只需要对500错误重试,加上currentError.status !== 500的判断,非500错误直接抛出,不进入重试流程。
  4. 可选的延迟重试:用delay(1000)让每次重试间隔1秒,避免短时间内频繁请求服务器,根据你的需求可以调整或移除。

这样修改后,当5次重试都失败时,订阅的错误回调就能拿到完整的最后一次错误信息,而不是空的成功结果啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:31:46