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); // 这里能拿到最后一次错误的状态码、响应体等所有信息 } );
关键代码解释
retryWhen:接收一个处理错误流的函数,我们可以在这里定义重试规则。scan操作符:用来累计重试次数,每次错误进来时更新计数。当计数达到设定的最大值(这里是4,对应5次尝试:1次初始请求+4次重试),就直接抛出当前的currentError——这个就是最后一次失败的真实错误对象,包含你需要的状态码、响应头等信息。- 可选的错误过滤:如果只需要对500错误重试,加上
currentError.status !== 500的判断,非500错误直接抛出,不进入重试流程。 - 可选的延迟重试:用
delay(1000)让每次重试间隔1秒,避免短时间内频繁请求服务器,根据你的需求可以调整或移除。
这样修改后,当5次重试都失败时,订阅的错误回调就能拿到完整的最后一次错误信息,而不是空的成功结果啦。
内容的提问来源于stack exchange,提问作者John Henckel
相关产品推荐
相关产品推荐

