Vue 结合 Axios 接口超时统一处理

2019-12-05 17:01:36

参考地址 Vue 结合 Axios 接口超时统一处理

引语:当网路慢的时候。又或者公司服务器不在内地的时候,接口数据请求不回来超时报错的情况相信大家肯定遇到过的,这里我把我公司项目请求超时的处理方法分享下,希望看过后有帮助。

axios基本用法就不多说了,详情直戳 : https://www.kancloud.cn/yunye/axios/234845

主要是思路: 对 axios 请求拦截器下功夫

解决方案一:(缺点:只重新请求1次,如果再超时的话,它就停止了,不会再请求) 后台只允许你重新发起一次请求(不能给服务器增压、浪费带宽无限请求,)下的情况推荐;

看了看axios的源代码,超时后, 会在拦截器那里 axios.interceptors.response 捕抓到错误信息, 且 error.code = "ECONNABORTED"

复制代码

 // 请求超时request.ontimeout = function handleTimeout() {  reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED', 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);
    }
});

复制代码

解决方法二:推荐

复制代码

//在main.js设置全局的请求次数,请求的间隙axios.defaults.retry = 4;axios.defaults.retryDelay = 1000;axios.interceptors.response.use(undefined, function axiosRetryInterceptor(err) { var config = err.config; // 如果config不存在或未设置重试选项,请拒绝
 if(!config || !config.retry) return Promise.reject(err); // 设置变量跟踪重试次数
 config.__retryCount = config.__retryCount || 0; // 检查是否已经达到最大重试总次数
 if(config.__retryCount >= config.retry) {  // 抛出错误信息
  return Promise.reject(err);
 } // 增加请求重试次数
 config.__retryCount += 1; // 创建新的异步请求
 var backoff = new Promise(function(resolve) {  setTimeout(function() {
   resolve();
  }, config.retryDelay || 1);
 }); // 返回axios信息,重新请求
 return backoff.then(function() {  return axios(config);
 });
});

复制代码

使用:

复制代码

axios.get('/some/endpoint', { retry: 5, retryDelay: 1000 })
    .then(function(res) {
        console.log('success', res.data);
    })
    .catch(function(err) {
        console.log('failed', err);
    });

复制代码

配置参数:

retry :第一次失败请求后重试请求的次数。
retryDelay: 失败请求之间等待的毫秒数(默认为1)。上述就是请求超时处理的的方案了。

扩展 axios 自定义配置新建一个 axios 实例  请求配置信息   Requst Config   以下是开发常用的一些配置选项

axios.create([config])
var instance = axios.create({  baseURL: 'https://some-domain.com/api/',  timeout: 1000,  headers: {'X-Custom-Header': 'foobar'}
});

config配置:

复制代码

//新建 config.jsimport Qs from 'qs'{ //请求的接口,在请求的时候,如axios.get(url,config);这里的url会覆盖掉config中的url
 url: '/user', // 请求方法同上
 method: 'get', // default // 基础url前缀
 baseURL: 'https://some-domain.com/api/',    transformRequest: [function (data) {   // 这里可以在发送请求之前对请求数据做处理,比如form-data格式化等,这里可以使用开头引入的Qs(这个模块在安装axios的时候就已经安装了,不需要另外安装)  data = Qs.stringify({});  return data;
 }], transformResponse: [function (data) {  // 这里提前处理返回的数据
  return data;
 }], // 请求头信息
 headers: {'X-Requested-With': 'XMLHttpRequest'}, //parameter参数
 params: {
  ID: 12345
 }, //post参数,使用axios.post(url,{},config);如果没有额外的也必须要用一个空对象,否则会报错 data: {
  firstName: 'Fred'
 }, //设置超时时间
 timeout: 1000, //返回数据类型
 responseType: 'json', // default}


  • 2019-07-30 22:36:10

    使用 Spring Initializr 初始化 Spring Boot 项目

    万事开头难,你需要设置一个目录结构存放各种项目内容,创建构建文件,并在其中加入各 种依赖。Spring Boot CLI消除了不少设置工作,但如果你更倾向于传统Java项目结构,那你应该 看看Spring Initializr。

  • 2019-08-06 15:30:08

    小程序展示富文本

    然而rich-text有个问题,它不能够给内联img设置宽度100%,这样图片就容易溢出屏幕。我们只能在后台返回富文本的时候对图片的img标签进行格式化。或者前端进行格式化也行,我赞成使用后端,因为很多种情况我们不一定都能想得到。

  • 2019-08-07 09:07:32

    最全的Service Worker讲解

    Service Worker 最主要的特点是:在页面中注册并安装成功后,运行于浏览器后台,不受页面刷新的影响,可以监听和截拦作用域范围内所有页面的 HTTP 请求。 基于 Service Worker API 的特性,结合 Fetch API、Cache API、Push API、postMessage API 和 Notification API,可以在基于浏览器的 web 应用中实现如离线缓存、消息推送、静默更新等 native 应用常见的功能,以给 web 应用提供更好更丰富的使用体验。

  • 2019-08-07 09:09:19

    windows系统下定时关闭程序

    其中xxx.exe是你要关闭的进程中运行的exe,可以ctrl+alt+del打开任务管理器,进到详细信息查看 然后把.txt文件后缀改成.bat(此时要在查看一栏勾上文件拓展名,要不还是txt文档)

  • 2019-08-07 09:16:43

    一个比较完美的PWA例子

    但就目前来讲,PWA是Google主推的一项技术标准,FireFox,Chrome以及一些基于Blink的浏览器已经支持渐进式Web应用了,Edge上对渐进式Web应用的支持还在开发。Apple公司也表示会考虑在自己Safari支持PWA。然而这项功能已经进入了WebKit内核的五年计划中。长期来看,对浏览器兼容性的支持方面应该已经不算太大问题了。况且在现阶段,在不支持渐进式Web应用的浏览器中,你的应用也只是无法使用渐进式Web应用的离线功能而已,除此之外的功能均可以正常使用。

  • 2019-08-07 09:57:48

    spring data jpa 实体类中字段不与数据库表映射

    当我们使用spring data jpa开发的时候,会将实体类中的成员变量与表中的字段一一对应,当我们在实体类中加上一个不与数据库表一一对应的成员变量的时候,此时我们只要在这个成员变量上加上注解@Transient @

  • 2019-08-07 17:16:53

    如何在 Node.js 中使用 import / export 的三种方法

    因为一些历史原因,虽然 Node.js 已经实现了 99% 的 ES6 新特性,不过截止 2018.8.10,How To Enable ES6 Imports in Node.JS 仍然是老大难问题,下面我来介绍三种方法可以让我们在 Node.js 中使用 import/export 。