網(wǎng)絡(luò)調(diào)用的手動(dòng)關(guān)閉類(lèi):AxiosCanceler.js
// import type { AxiosRequestConfig } from "axios";
// 用于存儲(chǔ)每個(gè)請(qǐng)求的標(biāo)識(shí)和取消函數(shù)
// const pendingMap = new Map < string, AbortController> ();
const pendingMap = new Map();
//config: AxiosRequestConfig
const getPendingUrl = (config) => {
return [config.method, config.url].join("&");
};
export class AxiosCanceler {
/**
* 添加請(qǐng)求
* @param config 請(qǐng)求配置
*/
addPending(config) {
this.removePending(config);
const url = getPendingUrl(config);
const controller = new AbortController();
config.signal = controller.signal;
if (!pendingMap.has(url)) {
// 如果當(dāng)前請(qǐng)求不在等待中,將其添加到等待中
pendingMap.set(url, controller);
}
}
/**
* 清除所有等待中的請(qǐng)求
*/
removeAllPending() {
pendingMap.forEach((abortController) => {
if (abortController) {
abortController.abort();
}
});
this.reset();
}
/**
* 移除請(qǐng)求
* @param config 請(qǐng)求配置
*/
removePending(config) {
const url = getPendingUrl(config);
if (pendingMap.has(url)) {
// 如果當(dāng)前請(qǐng)求在等待中,取消它并將其從等待中移除
const abortController = pendingMap.get(url);
if (abortController) {
abortController.abort(url);
}
pendingMap.delete(url);
}
}
/**
* 重置
*/
reset() {
pendingMap.clear();
}
}