import type { AxiosRequestConfig, Canceler } from 'axios'; import axios from 'axios'; import { isFunction } from '/@/utils/is'; // 用于存储每个请求的identification和cancellation function let pendingMap = new Map(); export const getPendingUrl = (config: AxiosRequestConfig) => [config.method, config.url].join('&'); export class AxiosCanceler { /** * 添加 * @param {Object} config */ addPending(config: AxiosRequestConfig) { this.removePending(config); const url = getPendingUrl(config); config.cancelToken = config.cancelToken || new axios.CancelToken((cancel) => { if (!pendingMap.has(url)) { // 如果在pending中没有当前请求,则添加它 pendingMap.set(url, cancel); } }); } /** * @description: 清除全部 */ removeAllPending() { pendingMap.forEach((cancel) => { cancel && isFunction(cancel) && cancel(); }); pendingMap.clear(); } /** * 删除 * @param {Object} config */ removePending(config: AxiosRequestConfig) { const url = getPendingUrl(config); if (pendingMap.has(url)) { // 如果在pending中有当前的请求标识符, // 当前请求需要被取消和删除 const cancel = pendingMap.get(url); cancel && cancel(url); pendingMap.delete(url); } } /** * @description: 重置 */ reset(): void { pendingMap = new Map(); } }