我在网上找了一个axios解决重复请求的代码
import axios from 'axios'
axios.defaults.baseURL = 'http://124.93.196.45:10001/'
const pendingRequest = new Map()
//`generateReqKey`:用于根据当前请求的信息,生成请求 Key;
function generateReqKey(config: any) {
const { method, url, params, data } = config
return [method, url, JSON.stringify(params), JSON.stringify(data)].join('&')
}
//`addPendingRequest:用于把当前请求信息添加到pendingRequest对象中;
function addPendingRequest(config: any) {
const requestKey = generateReqKey(config)
config.cancelToken =
config.cancelToken ||
new axios.CancelToken((cancel: any) => {
if (!pendingRequest.has(requestKey)) {
pendingRequest.set(requestKey, cancel)
}
})
}
//`removePendingRequest`:检查是否存在重复请求,若存在则取消已发的请求。
function removePendingRequest(config: any) {
const requestKey = generateReqKey(config)
if (pendingRequest.has(requestKey)) {
const cancelToken = pendingRequest.get(requestKey)
cancelToken(requestKey)
pendingRequest.delete(requestKey)
}
}
function clearPending() {
for (const [requestKey, cancelToken] of pendingRequest) {
cancelToken(requestKey)
}
pendingRequest.clear()
}
axios.interceptors.request.use(
function (config: any) {
removePendingRequest(config) // 检查是否存在重复请求,若存在则取消已发的请求
addPendingRequest(config) // 把当前请求信息添加到pendingRequest对象中
return config
},
(error) => {
// 这里出现错误可能是网络波动造成的,清空 pendingRequests 对象
pendingRequest.clear()
return Promise.reject(error)
}
)
axios.interceptors.response.use(
(response) => {
removePendingRequest(response.config) // 从