偷个懒 用下别人的代码 原帖 (侵删)
文中稍做修改 功能不变javascript
新建一个请求文件前端
import axios from 'axios' //取消请求 let CancelToken = axios.CancelToken //设置默认请求头,若是每次请求都携带token 建议写在这里 axios.defaults.headers = { } // 请求超时的时间限制 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 => { // 返回请求正确的结果 解构出须要返回的数据 const { data, status } = config return { data, status } }, error => { // 直接返回后台返回的错误的请求结果 若是须要前端自定义请参考原帖 return Promise.reject(error.message) })
若是须要把axios绑定到vue的原型上vue
在文件最上面引入vuejava
import Vue from 'vue'
// 将axios 的 post 方法,绑定到 vue 实例上面的 $post Vue.prototype.$post = (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 = (url, params) => { return new Promise((resolve, reject) => { axios.get(url, { params: params }).then(res => { resolve(res) // 返回请求成功的数据 data }).catch(err => { reject(err) }) }) }
最后将建立封装好的axios暴露出去ios
export default axios
main.js文件引入该文件web
假设文件叫axios 在libs文件夹下axios
import { axios } from './libs/axios.js'
而后在组件里使用请求api
this.$post('api接口', { name: "王", docType: "pson", requestName: 'name02' }).then(res => { console.log(res) }) this.$get('api接口', { name: "李", requestName: 'name01' }).then(res => { console.log(res) })
最后
补充下 参数requestName是本身自定义的一个参数,并非后台须要的数据 主要是用于区分是不是重复的请求 算是这个封装的灵魂吧 若是须要去除在判断method并赋值requestName后
delete config.data.requestName或者 delete config.params.requestNameiview
end…svg