import MD5 from 'md5' import Axios from 'axios' let pendingRequest:any = new Map() let delArr = ['user_req_id'] // 解析 const queryParse = query => { query = query.substring(query.indexOf('?') + 1) let arr = query.split('&') let params = {} arr.forEach(item => { let key = item.substring(0, item.indexOf('=')) let val = item.substring(item.indexOf('=') + 1) params[key] = val }) return params } const isJsonFn = (str) => { if (isNaN(Number(str))) { try { JSON.parse(str); return true; } catch (e) { return false; } } return false; } const generateReqKey = (apiMiddlewareContext:any , cacheJson:any, delList?: string[]) => { try { if(delList?.length){ delArr = delList } const url = apiMiddlewareContext.url || apiMiddlewareContext?.config?.url const cacheList = cacheJson.cacheList.filter(ele=> url.indexOf(ele.cacheUrl) > 0) const config = apiMiddlewareContext || apiMiddlewareContext.config || {} if(cacheList?.length){ const cacheItem = cacheList[0] // 参数Data let paramItem if(config.method=='get'){ if(config.params){ paramItem = config.params || {} const isJson = isJsonFn(paramItem) if(isJson){ paramItem = JSON.parse(paramItem) } delArr.forEach(ele=>{ if(paramItem && Object.keys(paramItem).length){ if(paramItem[ele]){ delete paramItem[ele] } } }) }else{ if(url.indexOf('?')>0){ let paramUrlObj:any = queryParse(url) || {} delArr.forEach(ele=>{ if(paramUrlObj && Object.keys(paramUrlObj).length){ if(paramUrlObj[ele]){ delete paramUrlObj[ele] } } }) paramItem = paramUrlObj } } }else{ paramItem = config.data || {} const isJson = isJsonFn(paramItem) if(isJson){ paramItem = JSON.parse(paramItem) } if(Array.isArray(paramItem)){ paramItem.forEach(ele=>{ Object.keys(ele).forEach(key=>{ if(delArr.includes(key)){ delete ele[key] } }) }) }else{ delArr.forEach(ele=>{ if(Object.keys(paramItem).length){ if(paramItem[ele]){ delete paramItem[ele] } } }) } } paramItem = JSON.stringify(paramItem) const urlHref = window.location.href?.split('?')[0] || '' // 路由 地址 方法 参数 const requestKey = `${urlHref}_${config.method}_${cacheItem.cacheUrl}_${paramItem}` const abstract = MD5(requestKey) return abstract } } catch (error) { return null } } export const addPendingRequest = (apiMiddlewareContext:any , cacheJson:any, delList?: string[]) => { const requestKey = generateReqKey(apiMiddlewareContext, cacheJson, delList) if (requestKey && !pendingRequest.has(requestKey)) { //判断pendingRequest中是否存在key apiMiddlewareContext.cancelToken = new Axios.CancelToken(cancel => { pendingRequest.set(requestKey, cancel) }) } } export const removePendingRequest = (apiMiddlewareContext:any , cacheJson:any, delList?: string[]) => { const requestKey = generateReqKey(apiMiddlewareContext, cacheJson, delList) if (requestKey && pendingRequest.has(requestKey)) { const cancel = pendingRequest.get(requestKey); cancel(requestKey); pendingRequest.delete(requestKey); } }