| 
						 | 
						- // 这里书写防抖,节流
 - 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)
 - }
 
 
  |