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 相关文章推荐
一段实时更新的时间代码
Jul 07 Javascript
JS实现浏览器菜单命令
Sep 05 Javascript
jQuery 学习第五课 Ajax 使用说明
May 17 Javascript
对new functionName()定义一个函数的理解
May 22 Javascript
javascript使用window.open提示“已经计划系统关机”的原因
Aug 15 Javascript
如何使用AngularJs打造权限管理系统【简易型】
May 09 Javascript
js/jq仿window文件夹框选操作插件
Mar 08 Javascript
JavaScript屏蔽Backspace键的实现代码
Nov 02 Javascript
JS实现仿微信支付弹窗功能
Jun 25 Javascript
JavaScript动态创建二维数组的方法示例
Feb 01 Javascript
JS开发常用工具函数(小结)
Jul 04 Javascript
layui内置模块layim发送图片添加加载动画的方法
Sep 23 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
实现PHP搜索加分页
2016/10/12 PHP
PDO::exec讲解
2019/01/28 PHP
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
【消息提示组件】,兼容IE6/7&&FF2
2007/09/04 Javascript
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
JQuery中getJSON的使用方法
2010/12/13 Javascript
js获取html参数及向swf传递参数应用介绍
2013/02/18 Javascript
用JavaScript获取DOM元素位置和尺寸大小的方法
2013/04/12 Javascript
javascript alert乱码的解决方法
2013/11/05 Javascript
node.js中的http.response.setHeader方法使用说明
2014/12/14 Javascript
IONIC自定义subheader的最佳解决方案
2016/09/22 Javascript
nodejs简单实现操作arduino
2016/09/25 NodeJs
jquery无法为动态生成的元素添加点击事件的解决方法(推荐)
2016/12/26 Javascript
解决给dom元素绑定click等事件无效问题的方法
2017/02/17 Javascript
微信小程序实现文字从右向左无限滚动
2020/11/18 Javascript
Vue.use()在new Vue() 之前使用的原因浅析
2019/08/26 Javascript
详解Vue中CSS样式穿透问题
2019/09/12 Javascript
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
2019/09/17 Javascript
Python标准库之sqlite3使用实例
2014/11/25 Python
探究python中open函数的使用
2016/03/01 Python
详解使用pymysql在python中对mysql的增删改查操作(综合)
2017/01/18 Python
Python实现破解猜数游戏算法示例
2017/09/25 Python
python随机生成库faker库api实例详解
2019/11/28 Python
Django 自定义权限管理系统详解(通过中间件认证)
2020/03/11 Python
简单了解python调用其他脚本方法实例
2020/03/26 Python
Python如何爬取qq音乐歌词到本地
2020/06/01 Python
scrapy redis配置文件setting参数详解
2020/11/18 Python
英国打印机墨盒销售网站:Ink Factory
2019/10/07 全球购物
安全大检查反思材料
2014/01/31 职场文书
学校安全防火方案
2014/06/07 职场文书
社会实践活动总结
2015/02/05 职场文书
十八大观后感
2015/06/12 职场文书
详解Python魔法方法之描述符类
2021/05/26 Python
python中opencv实现图片文本倾斜校正
2021/06/11 Python
如何搭建 MySQL 高可用高性能集群
2021/06/21 MySQL
Spring Cloud OAuth2实现自定义token返回格式
2022/06/25 Java/Android