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 相关文章推荐
javascript拓展DOM操作 prependChild insertAfert
Nov 17 Javascript
js取得url地址参数实例
Feb 22 Javascript
js innerHTML 改变div内容的方法
Aug 03 Javascript
jQuery拖拽div实现思路
Feb 19 Javascript
JS中自定义定时器让它在某一时刻执行
Sep 02 Javascript
node.js中的fs.chownSync方法使用说明
Dec 16 Javascript
JavaScript中计算网页中某个元素的位置
Jun 10 Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
Jan 01 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
Jul 21 Javascript
详解Node.js利用node-git-server快速搭建git服务器
Sep 27 Javascript
浅析Vue.js中v-bind v-model的使用和区别
Dec 04 Javascript
vue使用swiper.js重叠轮播组建样式
Nov 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
虹吸壶煮咖啡26个注意事项
2021/03/03 冲泡冲煮
PHP自动更新新闻DIY
2006/10/09 PHP
PHP实现限制IP访问的方法
2017/04/20 PHP
php微信公众号开发之秒杀
2018/10/20 PHP
php中get_object_vars()在数组的实例用法
2021/02/22 PHP
复制Input内容的js代码_支持所有浏览器,修正了Firefox3.5以上的问题
2010/06/21 Javascript
JQuery 选择和过滤方法代码总结
2010/11/19 Javascript
File, FileReader 和 Ajax 文件上传实例分析(php)
2011/04/27 Javascript
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
jquery批量设置属性readonly和disabled的方法
2014/01/24 Javascript
js中的setInterval和setTimeout使用实例
2014/05/09 Javascript
JQuery插入DOM节点的方法
2015/06/11 Javascript
用JavaScript动态建立或增加CSS样式表的实现方法
2016/05/20 Javascript
AngularJS下对数组的对比分析
2016/08/24 Javascript
jQuery判断是否存在滚动条的简单方法
2016/09/17 Javascript
node.js将MongoDB数据同步到MySQL的步骤
2017/12/10 Javascript
webpack+vue2构建vue项目骨架的方法
2018/01/09 Javascript
关于vue-router的那些事儿
2018/05/23 Javascript
JavaScript canvas基于数组生成柱状图代码实例
2020/03/06 Javascript
[03:06]2018年度CS GO最具人气解说-完美盛典
2018/12/16 DOTA
python解析发往本机的数据包示例 (解析数据包)
2014/01/16 Python
利用Python如何制作好玩的GIF动图详解
2018/07/11 Python
Python中垃圾回收和del语句详解
2018/11/15 Python
python selenium firefox使用详解
2019/02/26 Python
python爬虫开发之urllib模块详细使用方法与实例全解
2020/03/09 Python
用css3制作纸张效果(外翻卷角)
2013/02/01 HTML / CSS
纯css实现照片墙3D效果的示例代码
2017/11/13 HTML / CSS
亚洲领先的设计购物网站:Pinkoi
2020/11/26 全球购物
创新型城市实施方案
2014/03/06 职场文书
奥运会口号
2014/06/13 职场文书
售后客服工作职责
2014/06/16 职场文书
三峡导游词
2015/01/31 职场文书
小学校园广播稿
2015/08/18 职场文书
高二数学教学反思
2016/02/18 职场文书
学习心得体会
2019/06/20 职场文书
Java获取e.printStackTrace()打印的信息方式
2021/08/07 Java/Android