import type { AxiosRequestConfig } from 'axios' // 用于存储每个请求的标识和取消函数 const pendingMap = new Map() const getPendingUrl = (config: AxiosRequestConfig): string => { return [config.method, config.url].join('&') } export class AxiosCanceler { /** * 添加请求 * @param config 请求配置 */ public addPending(config: AxiosRequestConfig): void { this.removePending(config) const url = getPendingUrl(config) const controller = new AbortController() config.signal = config.signal || controller.signal if (!pendingMap.has(url)) { // 如果当前请求不在等待中,将其添加到等待中 pendingMap.set(url, controller) } } /** * 清除所有等待中的请求 */ public removeAllPending(): void { pendingMap.forEach((abortController) => { if (abortController) { abortController.abort() } }) this.reset() } /** * 移除请求 * @param config 请求配置 */ public removePending(config: AxiosRequestConfig): void { const url = getPendingUrl(config) if (pendingMap.has(url)) { // 如果当前请求在等待中,取消它并将其从等待中移除 const abortController = pendingMap.get(url) if (abortController) { abortController.abort(url) } pendingMap.delete(url) } } /** * 重置 */ public reset(): void { pendingMap.clear() } }