52 lines
1.1 KiB
JavaScript
52 lines
1.1 KiB
JavaScript
// 存储每个请求的标识和取消函数
|
|
const pendingRequest = new Map()
|
|
|
|
const getPendUrl = (config) => {
|
|
return `${config.method}&${config.url}`
|
|
}
|
|
|
|
export class AxiosCanceler {
|
|
/**
|
|
* 添加请求
|
|
* @param {*} config 请求配置
|
|
*/
|
|
addPendingRequest(config) {
|
|
const url = getPendUrl(config)
|
|
const controller = new AbortController() // 请求中止控制器
|
|
config.signal = controller.signal
|
|
if(!pendingRequest.has(url)) {
|
|
pendingRequest.set(url, controller)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 移除请求
|
|
* @param {*} config 请求配置
|
|
*/
|
|
removePendingRequest(config) {
|
|
const url = getPendUrl(config)
|
|
if(pendingRequest.has(url)) {
|
|
const abortController = pendingRequest.get(url)
|
|
if(abortController) {
|
|
abortController.abort(url)
|
|
}
|
|
pendingRequest.delete(url)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 移除所有请求
|
|
*/
|
|
removeAllPendingRequest() {
|
|
for (const abortController of pendingRequest) {
|
|
if(abortController)
|
|
abortController.abort()
|
|
}
|
|
this.reset()
|
|
}
|
|
|
|
reset() {
|
|
pendingRequest.clear()
|
|
}
|
|
}
|