console
let cache = {
list: [],
MAX_NUM: 100,
EXPIRED_TIME: 60000,
getRequestKey(config){
const { method, url, params, data } = config;
return [method, url, Qs.stringify(params), Qs.stringify(data)].join("&");
},
add({config, data}){
if(config.data) config.data = JSON.parse(config.data)
let key = this.getRequestKey(config)
let i = this.list.findIndex(t=>t.key === key)
if(i>-1){
this.list[i].data = data
this.list[i].resolve(data)
}else{
this.list.push({ time: Date.now(), key, data })
}
},
find(config){
let key = this.getRequestKey(config)
let i = this.list.findIndex(t=> t.key === key)
if(i>-1){
let f = this.list[i]
if(Date.now() - f.time > this.EXPIRED_TIME){
this.list.splice(i, 1)
}else{
return f
}
}
let t = {key, time: Date.now()}
t.data = new Promise((resolve)=>{
t.resolve = resolve
})
if(this.list.length === this.MAX_NUM){
this.list.shift()
}
this.list.push(t)
return undefined
}
}
let sendPost = function(data){
return axios({
url: 'http://nodejs-cloud-studio-demo-bkzxs.nodejs-cloud-studio-demo.50185620.cn-hangzhou.fc.devsapp.net/test',
method: 'post',
data
})
}
axios.interceptors.request.use(async function (config) {
let f = cache.find(config)
if(f){
config.adapter = function (config) {
return new Promise((resolve) => {
const res = {
status: 200,
statusText: 'OK',
headers: { 'content-type': 'application/json; charset=utf-8' },
config,
request: {}
}
if(f.data instanceof Promise){
f.data.then(data=>{
resolve({ ...res, data })
})
}else{
resolve({ ...res, data: f.data })
}
})
}
}
return config
})
axios.interceptors.response.use(
(response) => {
cache.add(response)
return response;
}
);
new Vue({
el: '#app',
mounted() {
this.$refs.btn1.click()
this.$refs.btn2.click()
},
methods: {
onClick1: async function(){
let res = await sendPost({username:'zs', age: 20})
console.log('请求1的结果', res.data)
},
onClick2: async function(){
let res = await sendPost({username:'zs', age: 20})
console.log('请求2的结果', res.data)
},
},
})
<div id="app">
<button @click="onClick1" ref="btn1">请求1</button>
<button @click="onClick2" ref="btn2">请求2</button>
</div>