axios请求超时

2023-11-16

axios请求超时,设置重新请求的完美解决方法

自从使用Vue2之后,就使用官方推荐的axios的插件来调用API,在使用过程中,如果服务器或者网络不稳定掉包了, 你们该如何处理呢? 下面我给你们分享一下我的经历。

具体原因
最近公司在做一个项目, 服务端数据接口用的是Php输出的API, 有时候在调用的过程中会失败, 在谷歌浏览器里边显示Provisional headers are shown。

按照搜索引擎给出来的解决方案,解决不了我的问题.

最近在研究AOP这个开发编程的概念,axios开发说明里边提到的栏截器(axios.Interceptors)应该是这种机制,降低代码耦合度,提高程序的可重用性,同时提高了开发的效率。

带坑的解决方案一
我的经验有限,觉得唯一能做的,就是axios请求超时之后做一个重新请求。通过研究 axios的使用说明,给它设置一个timeout = 6000

axios.defaults.timeout = 6000;
复制代码
然后加一个栏截器.

// Add a request interceptor
axios.interceptors.request.use(function (config) {
    // Do something before request is sent
    return config;
  }, function (error) {
    // Do something with request error
    return Promise.reject(error);
});

// Add a response interceptor
axios.interceptors.response.use(function (response) {
    // Do something with response data
    return response;
  }, function (error) {
    // Do something with response error
    return Promise.reject(error);
});

这个栏截器作用是 如果在请求超时之后,栏截器可以捕抓到信息,然后再进行下一步操作,也就是我想要用 重新请求。

这里是相关的页面数据请求。

this.$axios.get(url, {params:{load:'noload'}}).then(function (response) {
	//dosomething();
}).catch(error => {
	//超时之后在这里捕抓错误信息.
	if (error.response) {
		console.log('error.response')
		console.log(error.response);
	} else if (error.request) {
		console.log(error.request)
		console.log('error.request')
		if(error.request.readyState == 4 && error.request.status == 0){
			//我在这里重新请求
		}
	} else {
		console.log('Error', error.message);
	}
	console.log(error.config);
});

超时之后, 报出 Uncaught (in promise) Error: timeout of xxx ms exceeded的错误。

在 catch那里,它返回的是error.request错误,所以就在这里做 retry的功能, 经过测试是可以实现重新请求的功功能, 虽然能够实现 超时重新请求的功能,但很麻烦,需要每一个请API的页面里边要设置重新请求。

看上面,我这个项目有几十个.vue 文件,如果每个页面都要去设置超时重新请求的功能,那我要疯掉的.

而且这个机制还有一个严重的bug,就是被请求的链接失效或其他原因造成无法正常访问的时候,这个机制失效了,它不会等待我设定的6秒,而且一直在刷,一秒种请求几十次,很容易就把服务器搞垮了,请看下图, 一眨眼的功能,它就请求了146次。

带坑的解决方案二
研究了axios的源代码,超时后, 会在拦截器那里 axios.interceptors.response 捕抓到错误信息, 且 error.code = “ECONNABORTED”,

具体链接

// Handle timeout
request.ontimeout = function handleTimeout() {
  reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED',
    request));

  // Clean up request
  request = null;
};

所以,我的全局超时重新获取的解决方案这样的。

axios.interceptors.response.use(function(response){
....
}, function(error){
	var originalRequest = error.config;
	if(error.code == 'ECONNABORTED' && error.message.indexOf('timeout')!=-1 && !originalRequest._retry){
			originalRequest._retry = true
			return axios.request(originalRequest);
	}
});

这个方法,也可以实现得新请求,但有两个问题,1是它只重新请求1次,如果再超时的话,它就停止了,不会再请求。第2个问题是,我在每个有数据请求的页面那里,做了许多操作,比如 this.$axios.get(url).then之后操作。

完美的解决方法
以AOP编程方式,我需要的是一个 超时重新请求的全局功能, 要在axios.Interceptors下功夫,在github的axios的issue找了别人的一些解决方法,终于找到了一个完美解决方案,就是下面这个。

https://github.com/axios/axios/issues/164#issuecomment-327837467

//在main.js设置全局的请求次数,请求的间隙
axios.defaults.retry = 4;
axios.defaults.retryDelay = 1000;

axios.interceptors.response.use(undefined, function axiosRetryInterceptor(err) {
    var config = err.config;
    // If config does not exist or the retry option is not set, reject
    if(!config || !config.retry) return Promise.reject(err);
    
    // Set the variable for keeping track of the retry count
    config.__retryCount = config.__retryCount || 0;
    
    // Check if we've maxed out the total number of retries
    if(config.__retryCount >= config.retry) {
        // Reject with the error
        return Promise.reject(err);
    }
    
    // Increase the retry count
    config.__retryCount += 1;
    
    // Create new promise to handle exponential backoff
    var backoff = new Promise(function(resolve) {
        setTimeout(function() {
            resolve();
        }, config.retryDelay || 1);
    });
    
    // Return the promise in which recalls axios to retry the request
    return backoff.then(function() {
        return axios(config);
    });
});

其他的那个几十个.vue页面的 this.$axios的get 和post 的方法根本就不需要去修改它们的代码。

转载:https://juejin.im/post/5abe0f94518825558a06bcd9

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

axios请求超时 的相关文章

随机推荐

  • 单片机通过WH-LTE-7S4和外网服务器进行4G通信

    您想要实现什么功能 单片机通过WH LTE 7S4模块和外网服务器进行4G通信 您是如何连接和设置的 我还不太清楚如何设置 您遇到什么问题 1 你们网站上介绍的都是用你们公司专用的软件来设置4G模块TCP连接的外网地址和端口号 但是我需要在
  • tensorFlow 预训练模型下载地址

    https github com tensorflow models tree master research slim
  • leetcode 45.跳跃游戏 II

    一 题意 给出一个非负整数数组 nums 数组中的每个元素代表在该位置可以跳跃的最大长度 使用最少的跳跃次数到达数组的最后一个位置 假设总是可以到达数组的最后一个位置 二 解法 贪心算法 解法一 反向查找 从头开始找到第一个能到n 1位置的
  • NO1:how

  • 蓝桥杯有必要参赛吗?

    昨天和群里的小伙伴在群里聊 有的小伙伴竟然说蓝桥杯一等奖没有含量 我也是醉了 就像去年看了一个号主写的 研究生遍地都是 放眼全国14亿人口 别说研究生了 本科生占比有多少 蓝桥杯是我人生中得到的第一个大奖 在蓝桥杯大赛备赛期间 我学到了很多
  • 字节跳动面试题汇总 -- C++后端(含答案)

    malloc和new的区别 new delete 是 C 关键字 需要编译器支持 malloc free 是库函数 需要头文件支持 使用 new 操作符申请内存分配时无须指定内存块的大小 编译器会根据类型信息自行计算 而 malloc 则需
  • AIGC用于智能写作的技术综述-达观数据

    导语 图1 ChatGPT生成的关于智能写作的介绍 智能写作指使用自然语言处理技术来自动生成文本内容 这种技术通过分析给定语料库 学习文本的结构和语法 然后利用这些信息来生成新的文本 智能写作可以用来快速生成高质量的文本内容 并且可以用来完
  • 基于python管理系统论文_基于Python网络爬虫的设计与实现毕业论文+源码-学生毕业作品网站...

    本课题的主要目的是设计面向定向网站的网络爬虫程序 同时需要满足不同的性能要求 详细涉及到定向网络爬虫的各个细节与应用环节 搜索引擎作为一个辅助人们检索信息的工具 但是 这些通用性搜索引擎也存在着一定的局限性 不同领域 不同背景的用户往往具有
  • 第1章-Java语言概述

    Java基础知识图解 1 Java语言概述 1 1 Java简史 是SUN Stanford University Network 斯坦福大学网络公司 1995年推出的一门高级编程语言 是一种面向Internet的编程语言 Java一开始富
  • Unity的 Input.GetAxis使用

    使用GetAxis可获得很多常用的设备输入 鼠标左右键 滚轮 鼠标移动增量 空格跳跃 WSAD 可用这些输入增量进行操作控制 比如物体的前后左右移动 镜头前进后退 缩放观察 物体拖拽旋转等 转载于 https www cnblogs com
  • postman 执行下载接口时闪退问题

    下载内容过多时容易导致postman闪退 在试验接口正确性时不要着急 可以对下载日志大小进行一个缩减
  • vmware14安装黑苹果max ox x 10.13懒人版教程

    准备材料 vmware 14 0 链接 https pan baidu com s 1 fjAngjUZ9HihzboBR0eJA 提取码 wwnn vmware文件名后面有永久可用的序列号 14 0目前最高支持mac10 13 故使用这个
  • UVA 10970 - Big Chocolate

    Root AOAPC I Beginning Algorithm Contests Training Guide Rujia Liu UVA 10970 Big Chocolate 题意 计算将一块n m的巧克力切成n m块所需的次数 方法
  • Android studio报错:e: org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error

    Android studio运行时报错 e org jetbrains kotlin codegen CompilationException Back end JVM Internal error wrong bytecode gener
  • mtu设置--解决部分网站打不开的问题

    资料一 一 常见问题介绍 1 什么情况下需要改MTU 如果您的动态域名网站不能被正常访问 很难连接 连接上也非常慢 请试试把DirectSend设为 总是关闭 如果关闭后可以正常访问 这种情况就需要修改MTU 如果您的网站连接正常 只是下载
  • 达尔文商品体系

    一 背景介绍 最初是由天猫发起的 针对天猫品牌混乱 原始商品信息错误和商家重复铺货 商家的宝贝 库存价格等信息杂乱无章 商家发布商品流程冗长 管理商品非常不便 消费者也很难找到确定的商品相关信息 前台的搜索应用困难等问题 旨在规范商品信息确
  • 批量爬虫采集大数据的技巧和策略分享

    作为一名专业的爬虫程序员 今天主要要和大家分享一些技巧和策略 帮助你在批量爬虫采集大数据时更高效 更顺利 批量爬虫采集大数据可能会遇到一些挑战 但只要我们掌握一些技巧 制定一些有效的策略 我们就能在数据采集的道路上一帆风顺 1 设立合理的请
  • 服务器虚拟机无法连接msk,无法连接mks【图文详解】

    喜欢使用电脑的小伙伴们一般都会遇到win7系统无法连接mks的问题 突然遇到win7系统无法连接mks的问题就不知道该怎么办了 其实win7系统无法连接mks的解决方法非常简单 按照1 首先检查了下 windows的防火墙设置 可以看到Vm
  • QT笔记——QProcess学习

    我们常常想通过某一个类 来启动一个外部进程 本文将讲解如何通过QProcess来进行启动外部进程 一 了解QProcess QProcess是Qt框架提供的一个类 用于在应用程序中执行外部进程 它提供了一系列函数来启动 控制和与外部进程进行
  • axios请求超时

    axios请求超时 设置重新请求的完美解决方法 自从使用Vue2之后 就使用官方推荐的axios的插件来调用API 在使用过程中 如果服务器或者网络不稳定掉包了 你们该如何处理呢 下面我给你们分享一下我的经历 具体原因 最近公司在做一个项目