3 changed files with 44 additions and 42 deletions
			
			
		@ -1,59 +1,60 @@ | 
				
			|||||||
import type { InternalAxiosRequestConfig, Canceler } from 'axios' | 
					import type { AxiosRequestConfig } 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<string, Canceler>() | 
					const pendingMap = new Map<string, AbortController>() | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getPendingUrl = (config: InternalAxiosRequestConfig) => [config.method, config.url].join('&') | 
					const getPendingUrl = (config: AxiosRequestConfig): string => { | 
				
			||||||
 | 
					  return [config.method, config.url].join('&') | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
export class AxiosCanceler { | 
					export class AxiosCanceler { | 
				
			||||||
  /** | 
					  /** | 
				
			||||||
   * 添加请求 | 
					   * 添加请求 | 
				
			||||||
   * @param {Object} config | 
					   * @param config 请求配置 | 
				
			||||||
   */ | 
					   */ | 
				
			||||||
  addPending(config: InternalAxiosRequestConfig) { | 
					  public addPending(config: AxiosRequestConfig): void { | 
				
			||||||
    this.removePending(config) | 
					    this.removePending(config) | 
				
			||||||
    const url = getPendingUrl(config) | 
					    const url = getPendingUrl(config) | 
				
			||||||
    config.cancelToken = | 
					    const controller = new AbortController() | 
				
			||||||
      config.cancelToken || | 
					    config.signal = config.signal || controller.signal | 
				
			||||||
      new axios.CancelToken((cancel) => { | 
					    if (!pendingMap.has(url)) { | 
				
			||||||
        if (!pendingMap.has(url)) { | 
					      // 如果当前请求不在等待中,将其添加到等待中
 | 
				
			||||||
          // 如果当前没有待处理的请求,添加它
 | 
					      pendingMap.set(url, controller) | 
				
			||||||
          pendingMap.set(url, cancel) | 
					    } | 
				
			||||||
        } | 
					 | 
				
			||||||
      }) | 
					 | 
				
			||||||
  } | 
					  } | 
				
			||||||
 | 
					
 | 
				
			||||||
  /** | 
					  /** | 
				
			||||||
   * @description: 清除所有待处理 | 
					   * 清除所有等待中的请求 | 
				
			||||||
   */ | 
					   */ | 
				
			||||||
  removeAllPending() { | 
					  public removeAllPending(): void { | 
				
			||||||
    pendingMap.forEach((cancel) => { | 
					    pendingMap.forEach((abortController) => { | 
				
			||||||
      cancel && isFunction(cancel) && cancel() | 
					      if (abortController) { | 
				
			||||||
 | 
					        abortController.abort() | 
				
			||||||
 | 
					      } | 
				
			||||||
    }) | 
					    }) | 
				
			||||||
    pendingMap.clear() | 
					    this.reset() | 
				
			||||||
  } | 
					  } | 
				
			||||||
 | 
					
 | 
				
			||||||
  /** | 
					  /** | 
				
			||||||
   * 删除请求 | 
					   * 移除请求 | 
				
			||||||
   * @param {Object} config | 
					   * @param config 请求配置 | 
				
			||||||
   */ | 
					   */ | 
				
			||||||
  removePending(config: InternalAxiosRequestConfig) { | 
					  public removePending(config: AxiosRequestConfig): void { | 
				
			||||||
    const url = getPendingUrl(config) | 
					    const url = getPendingUrl(config) | 
				
			||||||
 | 
					 | 
				
			||||||
    if (pendingMap.has(url)) { | 
					    if (pendingMap.has(url)) { | 
				
			||||||
      // 如果有当前请求标识符处于pending状态,则需要取消当前请求并移除
 | 
					      // 如果当前请求在等待中,取消它并将其从等待中移除
 | 
				
			||||||
      const cancel = pendingMap.get(url) | 
					      const abortController = pendingMap.get(url) | 
				
			||||||
      cancel && cancel(url) | 
					      if (abortController) { | 
				
			||||||
 | 
					        abortController.abort(url) | 
				
			||||||
 | 
					      } | 
				
			||||||
      pendingMap.delete(url) | 
					      pendingMap.delete(url) | 
				
			||||||
    } | 
					    } | 
				
			||||||
  } | 
					  } | 
				
			||||||
 | 
					
 | 
				
			||||||
  /** | 
					  /** | 
				
			||||||
   * @description: reset | 
					   * 重置 | 
				
			||||||
   */ | 
					   */ | 
				
			||||||
  reset(): void { | 
					  public reset(): void { | 
				
			||||||
    pendingMap = new Map<string, Canceler>() | 
					    pendingMap.clear() | 
				
			||||||
  } | 
					  } | 
				
			||||||
} | 
					} | 
				
			||||||
 | 
				
			|||||||
		Reference in new issue