//新建防抖闭包函数,重复请求只执行最后一次
let requestfun = (() => {
let requestList = []; //声明一个数组用于存储每个ajax请求的取消函数和ajax标识
return {
removeRequest: config => {
requestList.forEach((i,n)=>{
if (i.u === `${config.url}&${config.method}`) {
//当当前请求在数组中存在时执行函数体
i.f(); //执行取消操作
requestList.splice(n, 1); //把这条记录从数组中移除
}
})
},
setRequestList: (u, fn) => {
requestList.push({
u: u, //定义标识符
f: fn //取消事件
});
}
};
})();
// 创建axios实例
const service = axios.create({
baseURL: process.env.BASE_URL, // api的baseURL
timeout: 60000 // 请求超时时间
});
// request拦截器
service.interceptors.request.use(
config => {
console.log("request===>", config);
// ------------------------------------------------------------------------------------
requestfun.removeRequest(config); //在一个ajax发送前执行一下取消操作
config.cancelToken = new axios.CancelToken(c => {
// 这里的ajax标识是用请求地址&请求方式拼接的字符串
requestfun.setRequestList(`${config.url}&${config.method}`, c);
});
// -----------------------------------------------------------------------------------------
return config;
},
error => {
console.log("request===error===>", error);
// Do something with request error
return Promise.reject(error);
}
);
// response 拦截器
service.interceptors.response.use(
response => {
console.log("response===>", response);
// ------------------------------------------------------------------------------------------
requestfun.removeRequest(response.config); //在一个ajax响应后再执行一下取消操作,把已经完成的请求从requestList中移除
// -------------------------------------------------------------------------------------------
if (response.data.code !== 200) {
return Promise.reject(response.data.message);
}
return response;
},
error => {
return Promise.reject(error);
}
);
如何使用axios的CancelToken,防止接口重复请求
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 一、简述 在传统的web项目中,防止重复提交,通常做法是:后端生成一个唯一的提交令牌(uuid),并存储在服务端。...
- 一、前言 axios的基础使用就不过多的讲解啦,如何使用可以看axios文档使用说明·Axios中文说明 在这里和...
- ----欢迎查看我的博客---- 什么是fetch 我们之前,过度过来都在用ajax,那么什么是 Fetch ...