const pendingRequest = new Map();
function generateReqKey(config) {
const { method, url, params, data } = config;
return [method, url, Qs.stringify(params), Qs.stringify(data)].join("&");
}
function addPendingRequest(config) {
const requestKey = generateReqKey(config);
config.cancelToken = config.cancelToken || new axios.CancelToken((cancel) => {
if (!pendingRequest.has(requestKey)) {
pendingRequest.set(requestKey, cancel);
}
});
}
function removePendingRequest(config) {
const requestKey = generateReqKey(config);
if (pendingRequest.has(requestKey)) {
const cancelToken = pendingRequest.get(requestKey);
cancelToken(requestKey);
pendingRequest.delete(requestKey);
}
}
请求拦截器
axios.interceptors.request.use(
function (config) {
removePendingRequest(config);
addPendingRequest(config);
return config;
},
(error) => {
return Promise.reject(error);
}
);
响应拦截器
axios.interceptors.response.use(
(response) => {
removePendingRequest(response.config);
return response;
},
(error) => {
removePendingRequest(error.config || {});
if (axios.isCancel(error)) {
console.log("已取消的重复请求:" + error.message);
} else {
}
return Promise.reject(error);
}
);