import axios, { AxiosRequestConfig } from 'axios';
import qs from 'qs';

/**
 * 缓存请求列表，防止重复请求
 */
const pending = new Map();

/**
 * 添加请求
 */
export function addPending(config: AxiosRequestConfig) {
    const url = [
        config.method,
        config.url,
        qs.stringify(config.params),
        qs.stringify(config.data),
    ].join('&');
    config.cancelToken =
        config.cancelToken ||
        new axios.CancelToken((cancel) => {
            if (!pending.has(url)) {
                //如果列表中不存在当前请求，则添加进去
                pending.set(url, cancel);
            }
        });
}

/**
 * 移除请求
 */
export function removePending(config: AxiosRequestConfig) {
    const url = [
        config.method,
        config.url,
        qs.stringify(config.params),
        qs.stringify(config.data),
    ].join('&');
    if (pending.has(url)) {
        //如果在列表中存在当前请求，需要取消当前请求，并且移除
        const cancel = pending.get(url);
        cancel(url);
        pending.delete(url);
    }
}

/**
 * 清空等待中的请求（在路由跳转时调用）
 */
export function clearPending() {
    for (const [url, cancel] of pending) {
        cancel(url);
    }
    pending.clear();
}