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 解决表单仍然提交即使监听处理函数返回false
Mar 14 Javascript
JS代码同步文本框内容的实例方法
Jul 12 Javascript
Javascript中string转date示例代码
Nov 01 Javascript
jquery判断checkbox是否选中及改变checkbox状态的实现方法
May 26 Javascript
JavaScript职责链模式概述
Sep 17 Javascript
详解Node.js中的事件机制
Sep 22 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
Dec 23 Javascript
Vue Cli3 创建项目的方法步骤
Oct 15 Javascript
JS使用栈判断给定字符串是否是回文算法示例
Mar 04 Javascript
了解JavaScript中的选择器
May 24 Javascript
原生js实现商品筛选功能
Oct 28 Javascript
react 路由Link配置详解
Nov 11 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字符串分割函数explode的实例代码
2013/02/07 PHP
PHP递归实现快速排序的方法示例
2017/12/18 PHP
ThinkPHP5&5.1实现验证码的生成、使用及点击刷新功能示例
2020/02/07 PHP
关于Javascript 对象(object)的prototype
2014/05/09 Javascript
jQuery 隐藏和显示 input 默认值示例
2014/06/03 Javascript
基于nodejs+express(4.x+)实现文件上传功能
2015/11/23 NodeJs
jquery获取复选框checkbox的值的简单实现方法
2016/05/26 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
2016/06/22 Javascript
纯css下拉菜单 无需js
2016/08/15 Javascript
浅析javaScript中的浅拷贝和深拷贝
2017/02/15 Javascript
Javascript中 toFixed四舍六入方法
2017/08/21 Javascript
js jquery 获取某一元素到浏览器顶端的距离实现方法
2018/09/05 jQuery
JavaScript中.min.js和.js文件的区别讲解
2019/02/13 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
2020/03/04 Javascript
vue-cli4.x创建企业级项目的方法步骤
2020/06/18 Javascript
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
分数霸榜! python助你微信跳一跳拿高分
2018/01/08 Python
Python中存取文件的4种不同操作
2018/07/02 Python
python安装pil库方法及代码
2019/06/25 Python
详解Matplotlib绘图之属性设置
2019/08/23 Python
pandas 强制类型转换 df.astype实例
2020/04/09 Python
使用Python FastAPI构建Web服务的实现
2020/06/08 Python
python获取linux系统信息的三种方法
2020/10/14 Python
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
存储过程和函数的区别
2013/05/28 面试题
DELPHI中如何调用API,可举例说明
2014/01/16 面试题
统计员岗位职责
2013/11/14 职场文书
园林设计专业毕业生求职信
2014/03/23 职场文书
党员个人对照检查材料思想汇报
2014/09/16 职场文书
股东授权委托书
2014/10/15 职场文书
团组织推优材料
2014/12/29 职场文书
综合素质评价自我评价
2015/03/06 职场文书
让文件路径提取变得更简单的Python Path库
2021/05/27 Python
简单总结SpringMVC拦截器的使用方法
2021/06/28 Java/Android
Python常用配置文件ini、json、yaml读写总结
2021/07/09 Python
Mysql数据库手动及定时备份步骤
2021/11/07 MySQL