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 相关文章推荐
input的focus方法使用
Mar 13 Javascript
使用javascript实现ListBox左右全选,单选,多选,全请
Nov 07 Javascript
js常用数组操作方法简明总结
Jun 20 Javascript
JavaScript中的console.log()函数详细介绍
Dec 29 Javascript
新手快速学习JavaScript免费教程资源汇总
Jun 25 Javascript
js实现砖头在页面拖拉效果
Nov 20 Javascript
Bootstrap实现的经典栅格布局效果实例【附demo源码】
Mar 30 Javascript
无循环 JavaScript(map、reduce、filter和find)
Apr 08 Javascript
JavaScript 中的 this 简单规则
Sep 19 Javascript
Angular4 组件通讯方法大全(推荐)
Jul 12 Javascript
详解webpack-dev-server使用方法
Sep 14 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
Mar 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
Codeigniter上传图片出现“You did not select a file to upload”错误解决办法
2014/06/12 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
2014/06/25 PHP
PHP使用preg_split()分割特殊字符(元字符等)的方法分析
2017/02/04 PHP
javascript使用eval或者new Function进行语法检查
2010/10/16 Javascript
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
javascript学习笔记(二) js一些基本概念
2012/06/18 Javascript
script的async属性以非阻塞的模式加载脚本
2013/01/15 Javascript
解决JS请求服务器gbk文件乱码的问题
2015/10/16 Javascript
JavaScript文本框脚本编写的注意事项
2016/01/25 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
2016/06/09 Javascript
Vue2仿淘宝实现省市区三级联动
2020/04/15 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
在React项目中使用Eslint代码检查工具及常见问题
2018/10/10 Javascript
JS判断数组四种实现方法详解
2020/06/29 Javascript
[03:23]我的刀塔你不可能这么可爱 第一期金萌萌的故事
2014/06/20 DOTA
Python开发如何在ubuntu 15.10 上配置vim
2016/01/25 Python
一张图带我们入门Python基础教程
2017/02/05 Python
python 迭代器和iter()函数详解及实例
2017/03/21 Python
python爬虫面试宝典(常见问题)
2018/03/02 Python
python获取代理IP的实例分享
2018/05/07 Python
python3解析库pyquery的深入讲解
2018/06/26 Python
pycharm中使用anaconda部署python环境的方法步骤
2018/12/19 Python
PYQT5设置textEdit自动滚屏的方法
2019/06/14 Python
简单了解python 生成器 列表推导式 生成器表达式
2019/08/22 Python
python matplotlib 画dataframe的时间序列图实例
2019/11/20 Python
python学生信息管理系统实现代码
2019/12/17 Python
深入浅析Python 命令行模块 Click
2020/03/11 Python
基于HTML5 WebGL的3D机房的示例
2018/03/16 HTML / CSS
香港钟表珠宝首饰商城:OneMallTime网摩间
2016/10/14 全球购物
Clarisonic美国官网:科莱丽声波洁面仪
2017/10/12 全球购物
建设单位项目负责人任命书
2014/06/06 职场文书
技术入股协议书
2016/03/22 职场文书
go语言-在mac下brew升级golang
2021/04/25 Golang
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS
Golang 字符串的常见操作
2022/04/19 Golang