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

这篇具有很好参考价值的文章主要介绍了axios请求超时,设置重新请求的完美解决方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

具体原因

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

超时问题:增加axios请求的超时设置,或者在等待一段时间后尝试再次发送请求。,前端,vue.js,Powered by 金山文档

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

最近在研究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的错误。

超时问题:增加axios请求的超时设置,或者在等待一段时间后尝试再次发送请求。,前端,vue.js,Powered by 金山文档

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

超时问题:增加axios请求的超时设置,或者在等待一段时间后尝试再次发送请求。,前端,vue.js,Powered by 金山文档

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

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

超时问题:增加axios请求的超时设置,或者在等待一段时间后尝试再次发送请求。,前端,vue.js,Powered by 金山文档
带坑的解决方案二

研究了axios的源代码,超时后, 会在拦截器那里 axios.interceptors.response 捕抓到错误信息, 且 error.code = “ECONNABORTED”,具体链接

https://github.com/axios/axios/blob/26b06391f831ef98606ec0ed406d2be1742e9850/lib/adapters/xhr.js#L95-L101

// 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 的方法根本就不需要去修改它们的代码。

以下是我做的一个试验。。把axios.defaults.retryDelay = 500, 请求 www.facebook.com

超时问题:增加axios请求的超时设置,或者在等待一段时间后尝试再次发送请求。,前端,vue.js,Powered by 金山文档

按照惯例,给出源代码,如有更好的建议,请告诉我,谢谢。

http://github.com/ssttm169/use-axios-well文章来源地址https://www.toymoban.com/news/detail-828049.html

到了这里,关于axios请求超时,设置重新请求的完美解决方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【完美解决】GitHub连接超时问题 Recv failure: Connection was reset

    已经开了梯子但是在Idea中使用git(GitHub)还是连接超时 Recv failure: Connection was reset 。此时需要让git走代理。 1.对右下角网络点击右键 - 打开 网络和Internet设置 2. 代理 - 查看到地址和端口号 127.0.0.1:7890 3.在终端(cmd)输入命令 4.查看是否设置成功 至此完成 相当丝滑 ^ ^

    2024年02月08日
    浏览(42)
  • axios 统一配置请求超时时间

    你可以通过配置 axios 的实例来统一设置请求的超时时间。以下是一个示例: 首先,安装 axios(如果还没有安装): 然后,在你的 Vue 项目中,你可以创建一个 axios 的实例,并设置默认的超时时间,然后将它应用到所有的请求。例如,你可以在项目的某个地方(例如 main.js )

    2024年02月03日
    浏览(37)
  • CSDN博客批量查询质量分https://yma16.inscode.cc/请求超时问题(设置postman超时时间)(接口提供者设置了nginx超时时间)

    https://yma16.inscode.cc/ 查询别人的一下子就返回了,查询我自己的,1分钟还不返回,然后就显示超时了。。 一开始我还以为是这个开源项目本身的问题,设置了请求超时时间,我还给它改了超时时间,后来发现不是的。。。 本来是100000的,我给改成1000000了,我对js代码不熟,

    2024年02月12日
    浏览(56)
  • Python爬虫requests判断请求超时并重新post/get发送请求

    在上面的示例中,send_request_get函数接受一个URL作为参数,并可选地指定最大重试次数和超时时间。函数使用 requests.get 发送GET请求,并设置了超时时间为5秒。如果请求超时,会捕获 requests.exceptions.Timeout 异常,并输出重试信息。如果发生其他异常,会捕获 requests.exceptions.Req

    2024年02月11日
    浏览(57)
  • axios设置超时时间

    方式一: 方式二: 3.创建实例 可以使用自定义配置新建一个 axios 实例 : axios.create([config]) 4.判断超时

    2024年02月12日
    浏览(48)
  • axios 设置超时时间 timeout

    在项目中,所有请求都是走统一封装过的axios,统一设置了超时时间: 但是有一个接口耗费时间巨长,网络不好时经常会超时,改统一设置的超时时间感觉不太好,所以想针对这个请求单独设置超时时间。 以下是普通请求: 单独设置请求超时时间:

    2024年02月16日
    浏览(44)
  • 解决axios异步请求问题(异步变为同步)

    在目前一个需求中,我需要等待axios请求完成后,判断请求是否出现异常,然后来判断是否关闭弹窗 修改后大概代码如下: 原来在方法中没有使用 async 和 await ,由于发送的axios请求是异步请求,所以在请求还没完成的时候 submitForm 这个方法就已经将 flag 返回了 这就导致了一

    2024年02月03日
    浏览(39)
  • 一文教你解决git请求github时候超时的问题

    前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 一. 问题 错误如下 Failed to connect to github.com port 443 after 21107 ms: Timed out 最近不知道为啥,直接通过https请求github仓库老是报错超时,时好时坏的,网上找了一些

    2024年02月07日
    浏览(49)
  • 【Vue.js】Vue3全局配置Axios并解决跨域请求问题

    对于前后端分离项目,前端和后端端口不能重复,否则会导致前端或者后端服务起不来。例如前端访问地址为: http://localhost:8080/ ,后端访问地址为 http://localhost:8081/ 。后端写好Controller,当用Axios访问该接口时,将会报错: Access to XMLHttpRequest at \\\' http://localhost:8081/login \\\' from

    2024年02月05日
    浏览(80)
  • Kafka连接超时问题及解决方法

    Kafka是一个高性能、分布式的消息队列系统,被广泛应用于大规模数据处理和实时流处理场景。然而,在使用Kafka进行远程连接时,有时会遇到连接超时的问题。本文将介绍Kafka连接超时问题的原因,并提供一些解决方法。 连接超时问题通常会在以下几种情况下出现: 网络问

    2024年02月04日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包