vue+axios实现相同请求地址3秒内禁止重复请求
时间: 2023-11-24 14:06:42 浏览: 168
封装axios拦截重复请求
可以通过在axios拦截器中进行处理来实现相同请求地址3秒内禁止重复请求的功能。具体实现步骤如下:
1. 在axios中创建一个请求队列,用于存储正在请求中的请求地址及其对应的取消函数。
```
const pending = []
```
2. 创建一个axios拦截器,在请求发送前先检查请求队列中是否已经存在相同请求地址的请求。若存在,则判断距离上次请求时间是否超过3秒,若是则允许发送请求,否则取消请求。
```
axios.interceptors.request.use(config => {
// 检查请求队列中是否已经存在相同请求地址的请求
const requestUrl = config.url
const index = pending.findIndex(item => item.url === requestUrl)
if (index !== -1) {
// 存在相同请求地址的请求
const timeDiff = Date.now() - pending[index].time
if (timeDiff < 3000) {
// 距离上次请求时间不足3秒,取消请求
pending[index].cancel()
pending.splice(index, 1)
} else {
// 距离上次请求时间超过3秒,允许发送请求
pending.splice(index, 1)
config.cancelToken = new axios.CancelToken(cancel => {
pending.push({ url: requestUrl, time: Date.now(), cancel })
})
}
} else {
// 不存在相同请求地址的请求,允许发送请求
config.cancelToken = new axios.CancelToken(cancel => {
pending.push({ url: requestUrl, time: Date.now(), cancel })
})
}
return config
})
```
3. 创建一个axios拦截器,在请求结束后将请求从请求队列中移除。
```
axios.interceptors.response.use(response => {
const requestUrl = response.config.url
const index = pending.findIndex(item => item.url === requestUrl)
if (index !== -1) {
pending.splice(index, 1)
}
return response
}, error => {
const requestUrl = error.config.url
const index = pending.findIndex(item => item.url === requestUrl)
if (index !== -1) {
pending.splice(index, 1)
}
return Promise.reject(error)
})
```
这样,每次发送请求时都会检查请求队列中是否存在相同请求地址的请求,若存在则判断距离上次请求时间是否超过3秒,若是则允许发送请求,否则取消请求。同时,在请求结束后将请求从请求队列中移除,以便下次请求。
阅读全文