import type { InternalAxiosRequestConfig, Canceler } from 'axios' import axios from 'axios' import { isFunction } from '@/utils/is' // Used to store the identification and cancellation function of each request let pendingMap = new Map() export const getPendingUrl = (config: InternalAxiosRequestConfig) => [config.method, config.url].join('&') export class AxiosCanceler { /** * 添加请求 * @param {Object} config */ addPending(config: InternalAxiosRequestConfig) { this.removePending(config) const url = getPendingUrl(config) config.cancelToken = config.cancelToken || new axios.CancelToken((cancel) => { if (!pendingMap.has(url)) { // 如果当前没有待处理的请求,添加它 pendingMap.set(url, cancel) } }) } /** * @description: 清除所有待处理 */ removeAllPending() { pendingMap.forEach((cancel) => { cancel && isFunction(cancel) && cancel() }) pendingMap.clear() } /** * 删除请求 * @param {Object} config */ removePending(config: InternalAxiosRequestConfig) { const url = getPendingUrl(config) if (pendingMap.has(url)) { // 如果有当前请求标识符处于pending状态,则需要取消当前请求并移除 const cancel = pendingMap.get(url) cancel && cancel(url) pendingMap.delete(url) } } /** * @description: reset */ reset(): void { pendingMap = new Map() } }