第一步 cacle.js
import axios from 'axios'
// 数据存储
export const cache = {
data: {},
set(key, data) {
this.data[key] = data
},
get(key) {
return this.data[key]
},
clear(key) {
delete this.data[key]
}
}
// 建立唯一的key值
export const buildUniqueUrl = (url, method, params = {}, data = {}) => {
const paramStr = (obj) => {
if (toString.call(obj) === '[object Object]') {
return JSON.stringify(Object.keys(obj).sort().reduce((result, key) => {
result[key] = obj[key]
return result
}, {}))
} else {
return JSON.stringify(obj)
}
}
url += `?${paramStr(params)}&${paramStr(data)}&${method}`
return url
}
// 防止重复请求
export default (options = {}) => async config => {
const defaultOptions = {
time: 0, // 设置为0,不清除缓存
...options
}
const index = buildUniqueUrl(config.url, config.method, config.params, config.data)
let responsePromise = cache.get(index)
if (!responsePromise) {
responsePromise = (async () => {
try {
const response = await axios.defaults.adapter(config)
return Promise.resolve(response)
} catch (reason) {
cache.clear(index)
return Promise.reject(reason)
}
})()
cache.set(index, responsePromise)
if (defaultOptions.time !== 0) {
setTimeout(() => {
cache.clear(index)
}, defaultOptions.time)
}
}
return responsePromise.then(data => JSON.parse(JSON.stringify(data))) // 为防止数据源污染
}
第二步 index请求接口封装页面引用
import cache from './cache'
// 全局设置
// axios.defaults.headers.post['Content-Type'] = 'application/json'
axios.defaults.withCredentials = true
const htp = axios.create({
baseURL: baseUrl,
timeout: 60000,
adapter: cache({
time: 1000
})
// headers: {
// token: window.localStorage.getItem('token') || ''
// }
})