为什么要写这个题目呢?因为之前写的一个Node程序有个小问题,使用的axios通过代理请求数据,时不时抽动代理服务器(阿布云)(407、413、503)。因为第一次写的时候是作为DEMO实现的,写的比较粗糙。只能说大体功能是正确的,但是没有容错机制。这里先算一算,一次请求等于1+100次,因为我内部会请求很多数据。如果只是第一次失败了,没关系,大不了再重发一次。但是,如果接下来的100次雷暴很少,就会导致101次请求全部失效。(因为返回的数据有误,用户会触发二次请求,既增加了服务端的压力,也增加了用户检查的压力)那么,为什么要实现这个功能呢,那我们就要开始实现了它。axios发起请求axios发送请求还是很简单的,所以我们可以直接模仿他来实现封装。axios({url:'https://www.lilnong.top/cors/axiosAutoTry',参数:'user=sf',方法:'get'}).then(console.log).catch(console.log)为了实现自动重试,我直接在数据中加了一个__try_count来设置重试次数。因为Axios支持promise,所以我们的方法也支持。如果axios成功我们也解决。如果axios失败,我们先判断次数,然后根据具体错误重试。407是我的理解。413是请求并发过高。为了不占用太多,可以加一个延时器。503也是我理解的惊厥ECONNABORTED。很奇怪,好好的资源不加载就卡了,所以我设置了timeoutECONNRESET也是一个很奇怪的错误。(既然是Node,我就理解他经常出错。)functionaxiosAutoTry(data){returnnewPromise((resolve,reject)=>{axios(data).then((data)=>{resolve(data)}).catch(error=>{//有重试次数if(typeofdata.__try_count=='number'&&data.__try_count>0){console.error('重试请求',error.message,data)data.__try_count--;if(error.code=='ECONNABORTED'){//中止,超时returnresolve(axiosAutoTry(data))}elseif(error.code=='ECONNRESET'){//returnresolve(axiosAutoTry(data))}else{if(error.response&&error.response.status==407){//代理407returnsetTimeout(v=>{resolve(axiosAutoTry(data))},500+Math.random()*500)}elseif(error.response&&error.response.status==503){//服务器异常returnsetTimeout(v=>{resolve(axiosAutoTry(data))},1000+Math.random()*500)}elseif(error.response&&error.response.status==429){//并发数超过限制returnsetTimeout(v=>{resolve(axiosAutoTry(data))},1000+Math.random()*1000)}//console.error('异常错误',error)}}reject(error)})})}微信公众号:前端linong欢迎大家关注我公众号有问题也可以加我微信前台-端交流群。
