axios拦截器拦截重复请求

取消重复请求

万能模板。

import axios from 'axios'
const  baseURL = "http://xxxx";
const instance = axios.create({ baseURL: baseURL, timeout: 30000 });
// 定义存放已发送但未响应的请求
const requestMap = new Map();
// 获取请求的唯一标识
const getRequestIdentify = (config, isReuest = false) => {
  // 由于不同项目的实现方式略有不同,url、params和data的格式可能略有不同,使用该方法时要根据实际情况进行调试修改
  let url = config.url
  if (isReuest) {
    url = url.startsWith('/') ? baseURL + url : baseURL + '/' + url;
  }
  return config.method === 'get' ? encodeURI(url + JSON.stringify(config.params)) : encodeURI(url + (typeof config.data === 'string' ? config.data : JSON.stringify(config.data)))
}
// HTTPrequest拦截
instance.interceptors.request.use(config => {
  const requestData = getRequestIdentify(config, true);
  if (requestMap.has(requestData)) {
    // map中存在该请求,不再重复发起
    return Promise.reject(new Error('重复请求'))
  } else if (!config.canReapeat) {
    // 通过在请求中设置 canReapeat 参数,允许特殊接口的重复提交
    // 若map中没有该请求,则将请求存入map,并发起请求
    requestMap.set(requestData, true)
  }
  //...
  return config
}, error => {
  return Promise.reject(error)
})
 
// HTTPresponse拦截
instance.interceptors.response.use(res => {
  const requestData = getRequestIdentify(res.config);
  // 请求获得响应后,将该请求从map中移除,以使后面的请求正常发送。
  if (requestMap.has(requestData)) {
    requestMap.delete(requestData)
  }
  let data = res.data;
  if(data.code==666){
    return data;
  }
}, (error) => {
  return Promise.reject(new Error(error))
})
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值