// 这里书写防抖,节流 import request from "@/api/request"; // 全局管理的存储状态 const requestControlMap = new Map() const MAX_MAP_SIZE = 1000 // 防止内存轻易泄露 // 请求标识生成器(更稳健的版本) const generateApiKey = (config) => { const { method, url, header, debounce, throttle } = config return `DEBOUNCE_AND_THROTTLE:${method}:${url}:${JSON.stringify(header)}:${debounce}:${throttle}`; } export default function http (config) { const apiKey = generateApiKey(config) // 空间保护 if (requestControlMap.size > MAX_MAP_SIZE) { requestControlMap.clear() // 清空缓存 // 类型保护 }else if (config.debounce > 0 && config.throttle > 0) { throw new Error('请勿同时使用防抖和节流!') } // 如果有防抖的需求 if (config.debounce > 0 ){ clearTimeout(requestControlMap.get(apiKey)?.timer) return new Promise((resolve, reject) => { requestControlMap.set(apiKey, { timer: setTimeout(() => { // 防抖时间到了,清除缓存并发起请求 requestControlMap.delete(apiKey) request(config).then(resolve).catch(reject) }, config.debounce), timeStamp: Date.now() }) }) } // 如果需要节流 if (config.throttle > 0){ const record = requestControlMap.get(apiKey) if (record && Date.now() - record.lastTime < config.throttle) { // 节流时间未到,不发起请求 return Promise.reject(new Error('请求过于频繁')) } requestControlMap.set(apiKey, { lastTime: Date.now(), timeStamp: Date.now() }) } // 正常发起请求 return request(config) }