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 相关文章推荐
Extjs显示从数据库取出时间转换JSON后的出现问题
Nov 20 Javascript
简介JavaScript中的getUTCFullYear()方法的使用
Jun 10 Javascript
AngularJS 中文API参考手册
Jul 28 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
Nov 09 Javascript
浅析webpack 如何优雅的使用tree-shaking(摇树优化)
Aug 16 Javascript
vue 2.0 购物车小球抛物线的示例代码
Feb 01 Javascript
JSON数据中存在单个转义字符“\”的处理方法
Jul 11 Javascript
微信小程序实现评论功能
Nov 28 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
Feb 12 Javascript
详解vue2.6插槽更新v-slot用法总结
Mar 09 Javascript
浅谈React Native 传参的几种方式(小结)
May 21 Javascript
js实现无缝轮播图效果
Mar 09 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 阴历-农历-转换类代码
2012/01/16 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
2016/03/22 PHP
Thinkphp5框架异常处理操作实例分析
2020/06/03 PHP
用js实现预览待上传的本地图片
2007/03/15 Javascript
jquery下异步提交表单 异步跨域提交表单
2010/11/17 Javascript
jquery入门——事件机制之事件中的冒泡现象示例解释
2020/09/12 Javascript
JQuery实现带排序功能的权限选择实例
2015/05/18 Javascript
探析浏览器执行JavaScript脚本加载与代码执行顺序
2016/01/12 Javascript
详解JavaScript的AngularJS框架中的表达式与指令
2016/03/05 Javascript
AngularJS入门教程之XHR和依赖注入详解
2016/08/18 Javascript
React实现双向绑定示例代码
2016/09/19 Javascript
JavaScript模块化之使用requireJS按需加载
2017/04/12 Javascript
Angular.js指令学习中一些重要属性的用法教程
2017/05/24 Javascript
JavaScript异步加载问题总结
2018/02/17 Javascript
node实现的爬虫功能示例
2018/05/04 Javascript
Vue子组件向父组件通信与父组件调用子组件中的方法
2018/06/22 Javascript
vue实现引入本地json的方法分析
2018/07/12 Javascript
详解Vue 如何监听Array的变化
2019/06/06 Javascript
一起写一个即插即用的Vue Loading插件实现
2019/10/31 Javascript
Python编程实现正则删除命令功能
2017/08/30 Python
详解Python在七牛云平台的应用(一)
2017/12/05 Python
python爬取足球直播吧五大联赛积分榜
2018/06/13 Python
python实现控制COM口的示例
2019/07/03 Python
django解决订单并发问题【推荐】
2019/07/31 Python
Python中实现输入一个整数的案例
2020/05/03 Python
J2EE中的容器都包括哪些
2013/08/21 面试题
智能电子应届生求职信
2013/11/10 职场文书
计算机网络专业推荐信
2013/11/24 职场文书
简历里的自我评价
2014/01/31 职场文书
学生周末回家住宿长期请假条
2014/02/15 职场文书
家庭贫困证明
2014/09/23 职场文书
十一国庆节“向国旗敬礼”主题班会活动方案
2014/09/27 职场文书
模范教师事迹材料
2014/12/16 职场文书
教师旷工检讨书
2015/08/15 职场文书
Java并发编程之详解CyclicBarrier线程同步
2021/06/23 Java/Android
python实现局部图像放大
2021/11/17 Python