vue interceptor 使用教程实例详解


Posted in Javascript onSeptember 13, 2018

二次封装axios,根据参数来实现多个请求多次拦截

1. 新建 axiosTool.js 文件,设置请求拦截和处理的逻辑

import Vue from 'vue'
import axios from 'axios'
//取消请求
let CancelToken = axios.CancelToken
//设置默认请求头,如果不需要可以取消这一步
axios.defaults.headers = {
  'X-Requested-With': 'XMLHttpRequest'
}
// 请求超时的时间限制
axios.defaults.timeout = 20000
// 开始设置请求 发起的拦截处理
// config 代表发起请求的参数的实体
axios.interceptors.request.use(config => {
  // 得到参数中的 requestName 字段,用于决定下次发起请求,取消对应的 相同字段的请求
  // 如果没有 requestName 就默认添加一个 不同的时间戳
  let requestName
  if(config.method === 'post'){
    if(config.data && config.data.requestName){
      requestName = config.data.requestName
    }else{
      requestName = new Date().getTime()
    }
  }else{
    if(config.params && config.params.requestName){
      requestName = config.params.requestName
    }else{
      requestName = new Date().getTime()
    }
  }
  // 判断,如果这里拿到的参数中的 requestName 在上一次请求中已经存在,就取消上一次的请求
  if (requestName) {
    if (axios[requestName] && axios[requestName].cancel) {
      axios[requestName].cancel()
    }
    config.cancelToken = new CancelToken(c => {
      axios[requestName] = {}
      axios[requestName].cancel = c
    })
  }
  return config
}, error => {
  return Promise.reject(error)
})
// 请求到结果的拦截处理
axios.interceptors.response.use(config => {
  // 返回请求正确的结果
  return config
}, error => {
  // 错误的请求结果处理,这里的代码根据后台的状态码来决定错误的输出信息
  if (error && error.response) {
    switch (error.response.status) {
      case 400:
        error.message = '错误请求'
        break
      case 401:
        error.message = '未授权,请重新登录'
        break
      case 403:
        error.message = '拒绝访问'
        break
      case 404:
        error.message = '请求错误,未找到该资源'
        break
      case 405:
        error.message = '请求方法未允许'
        break
      case 408:
        error.message = '请求超时'
        break
      case 500:
        error.message = '服务器端出错'
        break
      case 501:
        error.message = '网络未实现'
        break
      case 502:
        error.message = '网络错误'
        break
      case 503:
        error.message = '服务不可用'
        break
      case 504:
        error.message = '网络超时'
        break
      case 505:
        error.message = 'http版本不支持该请求'
        break
      default:
        error.message = `连接错误${error.response.status}`
    }
  } else {
    error.message = "连接到服务器失败"
  }
  return Promise.reject(error.message)
})
// 将axios 的 post 方法,绑定到 vue 实例上面的 $post
Vue.prototype.$post = function (url, params) {
  return new Promise((resolve, reject) => {
    axios.post(url, params)
      .then(res => {
        resolve(res)
      }).catch(err => {
      reject(err)
    })
  })
}
// 将axios 的 get 方法,绑定到 vue 实例上面的 $get
Vue.prototype.$get = function (url, params) {
  return new Promise((resolve, reject) => {
    axios.get(url, {
      params: params
    }).then(res => {
      resolve(res) // 返回请求成功的数据 data
    }).catch(err => {
      reject(err)
    })
  })
}
// 请求示例
// requestName 为多余的参数 作为请求的标识,下次发起相同的请求,就会自动取消上一次还没有结束的请求
// 比如正常的请求参数只有一个 name: '123',但是这里我们需要额外再加上一个 requestName
/**
  this.$post(url, { name: '123', requestName: 'post_1' })
    .then(res => {
      console.log(`请求成功:${res}`)
    })
 */
export default axios

2. 再 main.js 中引入该文件

import { axios } from './static/js/axiosTool'

3. 在组件中直接使用即可

this.$post(this.url2, {
  name: "王",
  docType: "pson",
  requestName: 'name02'
}).then(res => {
  console.log(res)
})

this.$get(this.url, {
  name: "李",
  requestName: 'name01'
}).then(res => {
  console.log(res)
})

4. 效果如图:

vue interceptor 使用教程实例详解

总结

以上所述是小编给大家介绍的vue interceptor 使用教程实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
获取dom元素那些讨厌的位置封装代码
Jun 23 Javascript
基于jquery的可多选的下拉列表框
Jul 20 Javascript
jquery如何实现锚点链接之间的平滑滚动
Dec 02 Javascript
JS对象转换为Jquery对象示例
Jan 26 Javascript
js实现千分符和保留几位小数的简单实例
Aug 01 Javascript
Bootstrap CSS组件之按钮组(btn-group)
Dec 17 Javascript
详解Angular.js指令中scope类型的几种特殊情况
Feb 21 Javascript
微信小程序表单验证错误提示效果
May 19 Javascript
Mac系统下Webstorm快捷键整理大全
May 28 Javascript
vue上传图片到oss的方法示例(图片带有删除功能)
Sep 27 Javascript
微信小程序canvas.drawImage完全显示图片问题的解决
Nov 30 Javascript
微信小程序的线程架构【推荐】
May 14 Javascript
Vue点击切换颜色的方法
Sep 13 #Javascript
node中的cookie的具体使用
Sep 13 #Javascript
vue动态改变背景图片demo分享
Sep 13 #Javascript
vue vue-Router默认hash模式修改为history需要做的修改详解
Sep 13 #Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
Sep 13 #Javascript
详解React中传入组件的props改变时更新组件的几种实现方法
Sep 13 #Javascript
vue 刷新之后 嵌套路由不变 重新渲染页面的方法
Sep 13 #Javascript
You might like
一个简单的自动发送邮件系统(三)
2006/10/09 PHP
如何隐藏你的.php文件
2007/01/04 PHP
php win下Socket方式发邮件类
2009/08/21 PHP
php输出1000以内质数(素数)示例
2014/02/16 PHP
浅谈PHP调用Webservice思路及源码分享
2014/06/04 PHP
Yii框架获取当前controlle和action对应id的方法
2014/12/03 PHP
php函数传值的引用传递注意事项分析
2016/06/25 PHP
通过实例解析PHP数据类型转换方法
2020/07/11 PHP
深入认识JavaScript中的函数
2007/01/22 Javascript
javascript window.opener的用法分析
2010/04/07 Javascript
javascript 模式设计之工厂模式学习心得
2010/04/27 Javascript
JS等比例缩小图片尺寸的实例
2013/02/27 Javascript
基于jQuery.Validate验证库知识点的详解
2013/04/26 Javascript
JavaScript定时器详解及实例
2013/08/01 Javascript
将input file的选择的文件清空的两种解决方案
2013/10/21 Javascript
textarea 控制输入字符字节数(示例代码)
2013/12/27 Javascript
100个不能错过的实用JS自定义函数
2014/03/05 Javascript
JQuery遍历json数组的3种方法
2014/11/08 Javascript
Javascript创建类和对象详解
2017/05/31 Javascript
ES6学习教程之块级作用域详解
2017/10/09 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
浅谈vuex为什么不建议在action中修改state
2020/02/02 Javascript
[03:42]2018完美盛典-《加冕》
2018/12/16 DOTA
Python使用ftplib实现简易FTP客户端的方法
2015/06/03 Python
Python中的字符串替换操作示例
2016/06/27 Python
Tensorflow之梯度裁剪的实现示例
2020/03/08 Python
如何把外网python虚拟环境迁移到内网
2020/05/18 Python
Python return语句如何实现结果返回调用
2020/10/15 Python
幼儿园庆六一游园活动方案
2014/01/29 职场文书
大学生社团活动总结
2014/04/26 职场文书
春节联欢会策划方案
2014/05/16 职场文书
党员目标管理责任书
2014/07/25 职场文书
学习党的群众路线实践活动思想汇报
2014/09/12 职场文书
解析:创业计划书和商业计划书二者之间到底有什么区别
2019/08/14 职场文书
使用python向MongoDB插入时间字段的操作
2021/05/18 Python
Python创建SQL数据库流程逐步讲解
2022/09/23 Python