开始

在全局包装一层axios,方便之后的调用、权限、异常等处理。

utils/http.js

  1. const axios = require('axios');
  2. const http = function() {
  3. // 全局的请求次数,请求的间隙,超时时间
  4. axios.defaults.retry = 1;
  5. axios.defaults.retryDelay = 100;
  6. axios.defaults.timeout = 1000 * 36;
  7. // 包装request
  8. axios.interceptors.request.use(
  9. function(config) {
  10. // Do something before request is sent
  11. return config;
  12. },
  13. function(error) {
  14. // Do something with request error
  15. return Promise.reject(error);
  16. },
  17. );
  18. // 包装response
  19. axios.interceptors.response.use(
  20. function(response) {
  21. return response.data;
  22. },
  23. function(error) {
  24. // error.response 是接口返回等结构体
  25. // 如果为undefined,就视为没有返回,体现为超时
  26. if (error.response) {
  27. // 对特殊错误码进行处理
  28. if (error.response.status === 401) {
  29. window.location.href = '/login?callback=' + window.location.href;
  30. }
  31. return Promise.reject(error);
  32. } else {
  33. var config = error.config;
  34. // 如果配置不存在或未设置重试选项,就拒绝
  35. if (!config || !config.retry) return Promise.reject(error);
  36. // 设置用于跟踪重试计数的变量
  37. config.__retryCount = config.__retryCount || 0;
  38. // 检查我们是否已达到最大重试次数
  39. if (config.__retryCount >= config.retry) {
  40. // 以错误拒绝
  41. return Promise.reject(err);
  42. }
  43. // 增加重试次数
  44. config.__retryCount += 1;
  45. // 创建新承诺以处理指数退避
  46. var backoff = new Promise(function(resolve) {
  47. setTimeout(function() {
  48. resolve();
  49. }, config.retryDelay || 1);
  50. });
  51. // 返回撤回axios重试请求的承诺
  52. return backoff.then(function() {
  53. return axios(config);
  54. });
  55. }
  56. },
  57. );
  58. return axios;
  59. }
  60. Vue.prototype.$http = http();

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