重复点击或者多tab标签使用一个视图等(固然也能够用加载中或者透明背景禁止请求中再次点击)ios
来自于互联网axios
let pending = []; //声明一个数组用于存储每一个请求的取消函数和axios标识 let cancelToken = axios.CancelToken; let removePending = (config) => { for(let p in pending){ if(pending[p].u === config.url + '&' + config.method) { //当当前请求在数组中存在时执行函数体 pending[p].f(); //执行取消操做 pending.splice(p, 1); } } } // http请求拦截器 axios.interceptors.request.use(config => { removePending(config); //在一个axios发送前执行一下取消操做 config.cancelToken = new cancelToken((c)=>{ // 这里的axios标识我是用请求地址&请求方式拼接的字符串,固然你能够选择其余的一些方式 pending.push({ u: config.url + '&' + config.method, f: c }); }); return Promise.resolve(config) }, error => { return Promise.reject(error) }) // http响应拦截器 axios.interceptors.response.use(data => { removePending(data.config); //在一个axios响应后再执行一下取消操做,把已经完成的请求从pending中移除 return Promise.resolve(data) }, error => { //加载失败 return {'data':{}} // return Promise.reject(error) })
通过屡次测试发现不一样请求也给我取消了,缘由是没有校验请求参数,也就是说get请求能够用,修改如下代码数组
pending.push({ u: config.url + '&' + config.method, f: c });
修改成:函数
pending.push({ u: config.url + JSON.stringify(config.data) +'&' + config.method, f: c });//config.data为请求参数
上面判断也须要修改,这样get请求和post均可以用了post
(我的理解)
官方提供了axios.CancelToken
来取消上一次请求方法,所以只须要判断上一次请求是否重复。声明数组变量 pending
用于存储每一个请求实例的axios标识(请求方式,请求参数,请求url)和该实例的取消函数;在请求拦截器中建立取消函数实例,将请求的标识(判断重复标识)及 该请求实例取消函数 push
到pending
数组中,建立取消上一次请求方法 removePending
,该方法主要判断axios请求标识是否重复,重复则执行该实例的取消函数,而且从 pending
中移除标识及该实例取消函数。测试