封装axios实现自动重试

简介: 因为之前写的一个 Node 程序有点小问题,使用的 axios 通过代理请求数据,代理服务器(阿布云)时不时抽风(407、413、503)。因为第一次写的时候当做一个 DEMO 去实现的,写的挺简陋,只能说大体功能对,但是没有容错机制。这里我们先算一笔帐啊,一次请求等于 1+100 次,因为我内部还会请求好多数据。如果只是第一次失败了,那么无关紧要,大不了重发一次。但是如果是后面 100 次中有极个别暴雷了,那么就会导致整个101次请求全部作废。好了,为什么实现这个功能说了,那么我们要我们要开始实现了。

axios 发起请求


axios 发请求还是很简单的,那么我们可以直接仿照他来实现一下封装。


axios({
    url: 'https://www.lilnong.top/cors/axiosAutoTry',
    params: 'user=sf',
    method: 'get'
})
.then(console.log)
.catch(console.log)


bVbGBnc.webp.jpg


实现自动重试


我直接在 data 上增加一个 __try_count 用于设置重试次数。


因为 Axios 是支持 Promise,所以我们的方法也支持。


axios 如果成功了我们也 resolve。


axios 如果失败了我们先判断次数,然后根据具体的错误,进行重试。


  • 407 就是我理解的抽风


  • 413 是请求并发太高,为了不占用多少可以加个延时器。


  • 503 也是我理解的抽风


  • ECONNABORTED 很奇怪好好的资源他也不加载就卡住了,所以我设置了 timeout


  • ECONNRESET 也是一个很奇怪的错误。(既然是 Node,我理解他经常出错误。)


function axiosAutoTry(data){
    return new Promise((resolve, reject)=>{
        axios(data)
        .then((data)=>{
            resolve(data)
        })
        .catch(error=>{
            // 有重试次数
            if(typeof data.__try_count == 'number' && data.__try_count>0){
                console.error('重试请求', error.message, data)
                data.__try_count--;
                if(error.code == 'ECONNABORTED'){
                    // 中止,超时
                    return resolve(axiosAutoTry(data))
                }else if(error.code == 'ECONNRESET'){
                    // 
                    return resolve(axiosAutoTry(data))
                }else{
                    if(error.response && error.response.status == 407){
                        // 代理407
                        return setTimeout(v=>{
                            resolve(axiosAutoTry(data))
                        }, 500 + Math.random() * 500)
                    }else if(error.response && error.response.status == 503){
                        // 服务器异常
                        return setTimeout(v=>{


相关文章
|
9天前
|
资源调度 JavaScript 前端开发
vue-element-admin 综合开发四:axios安装和封装、mock安装/学习/使用
这篇文章是关于如何在Vue项目中使用axios进行网络请求、二次封装axios以及使用mockjs模拟响应数据的教程。
32 1
vue-element-admin 综合开发四:axios安装和封装、mock安装/学习/使用
|
1月前
封装axios的get、post方法
本文介绍了如何封装axios的get和post方法,并展示了具体的代码实现,包括使用axios创建实例、设置请求拦截器以及定义get和post函数。
67 2
|
9天前
vue3 + Ts 中 使用 class 封装 axios
【10月更文挑战第8天】
59 1
|
12天前
vue3 + Ts 中 使用 class 封装 axios
【10月更文挑战第5天】
73 1
|
4天前
|
前端开发 JavaScript API
自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南
自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南
21 0
|
18天前
|
JavaScript API 开发工具
vue尚品汇商城项目-day02【11.对axios二次封装+12.接口统一管理】
vue尚品汇商城项目-day02【11.对axios二次封装+12.接口统一管理】
24 0
|
2月前
|
JSON JavaScript 前端开发
【Vue面试题二十四】、Vue项目中有封装过axios吗?主要是封装哪方面的?
这篇文章讨论了在Vue项目中封装axios的最佳实践,包括设置接口请求前缀、请求头、状态码、请求方法的封装,以及如何使用请求和响应拦截器来处理token和响应状态,从而简化HTTP请求的配置和错误处理,提高代码的可维护性。
【Vue面试题二十四】、Vue项目中有封装过axios吗?主要是封装哪方面的?
|
3月前
|
存储 开发框架 前端开发
基于SqlSugar的开发框架循序渐进介绍(10)-- 利用axios组件的封装,实现对后端API数据的访问和基类的统一封装处理
基于SqlSugar的开发框架循序渐进介绍(10)-- 利用axios组件的封装,实现对后端API数据的访问和基类的统一封装处理
|
4月前
|
JavaScript
vue对axios封装
vue对axios封装
|
3月前
|
前端开发
网页设计,若依项目修改(It must be done)02------axios封装后发get请求,axios请求的位置在呢?
网页设计,若依项目修改(It must be done)02------axios封装后发get请求,axios请求的位置在呢?