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))) // 为防止数据源污染 }
例如javascript
import axios from 'axios' import cache from './cache' // get请求 export async function getData (payload) { return axios.get('/path', { params: payload, adapter: cache({ time: 0 }) }) } // post请求 export async function postData (payload) { return axios.post('/path', payload, { adapter: cache({ time: 1000 }) }) }
time 表示可缓存的时间,默认为0,在没有清除内存以前永久缓存(浏览器窗口标签关闭,应用程序关闭等会清除内存)java
time 设置一个极短的时间,好比1000,就表示在1000毫秒以内不会重复向服务器发出请求,固然你也能够用new CancelToken,但会致使本次请求报错,须要作异常处理ios