如何封装请求接口,过滤重复请求,优化请求性能
import Axios from 'axios'
import qs from 'qs'
const pendingRequest = new Map()
const getPendingUrl = config => {
const { method, url, params, data, originUrl, removeRepeat } = config
if(url === '/analyze/ship/statistics/out-goods' || removeRepeat) {
return originUrl ? [method, originUrl].join('&') : [method, url].join('&')
} else return [method, url, qs.stringify(params), qs.stringify(data)].join('&')
}
const addPendingRequest = config => {
const url = getPendingUrl(config)
removePendingRequest(config)
if (pendingRequest.has(url)) {
config.cancelToken = new Axios.CancelToken(cancel => {
cancel(url)
})
} else {
config.cancelToken =
config.cancelToken ||
new Axios.CancelToken(cancel => {
pendingRequest.set(url, cancel)
})
}
}
const removePendingRequest = config => {
if (config) {
const url = getPendingUrl(config)
if (pendingRequest.has(url)) {
const cancelToken = pendingRequest.get(url)
cancelToken && cancelToken(url)
pendingRequest.delete(url)
}
}
}
export { addPendingRequest, removePendingRequest }