首先需要了解一下,axios的官方API(https://www.kancloud.cn/yunye/axios/234845),知道当中的参数配置。
url?: string;
method?: string;
baseURL?: string;
...省略...
cancelToken?: CancelToken;
在这里,我重点讲的便是cancelToken这个参数。
var CancelToken = axios.CancelToken
var source = CancelToken.source()
// let that = this
axios.interceptors.request.use(function (config) {
// 预处理请求信息(config)
console.log(config)
let dt = new Date()
let pd = intercept.createIntercept(store, config.name, dt.getTime())
if (pd === false) {
config.cancelToken = source.token
// 取消请求(message 参数是可选的)
source.cancel('Operation canceled by the user.')
}
return config
}, function (error) {
// 预处理请求有异常(error)时抛出错误
return Promise.reject(error)
})
核心的方法便是
config.cancelToken = source.token
修改这一个属性,便能取消请求,至于在什么条件下取消请求,这个因人而异,我在外部写了一个工具函数intercept.createIntercept(store, config.name, dt.getTime()),配合vuex一切使用的。
const intercept = {
createIntercept (thisw, name, dt) {
console.log(thisw)
console.log(name)
let nameMap = thisw.state.nameMap
// get方法,若是返回undefiend
if (nameMap.get(name) === undefined) {
nameMap.set(name, dt)
} else if (nameMap.get(name) !== undefined && ((dt - nameMap.get(name)) > 3000)) {
nameMap.set(name, dt)
console.log(thisw.state)
} else if (nameMap.get(name) !== undefined && ((dt - nameMap.get(name)) < 3000)) {
console.log('时间太短了!')
return false
}
// console.log(nameMap)
// return false
}
}
export default intercept
这个工具函数的作用是,同一个函数在3秒内不会再次发送请求。