axios添加缓存请求,防止多次请求,单页面多个同一组件造成多次请求解决方案

在 vue 开发中,我们偶尔会遇到相同组件多次调用一个请求的问题,即使添加了缓存,但在第一次调用时也会出现这类问题,这种问题的根源往往是由于第一个组件发起的请求没有返回数据,第二个组件没有在缓存中获取到数据而重新发起请求。
解决这种问题我们往往可以分两种:

  1. 修改组件,将要请求的数据单独提出来,在父组件中请求,然后通过属性赋值。但这种方式就会造成大量的相同代码,可以使用全局混入来解决相同代码问题,但是这也不够简洁,且不够灵活。
  2. 修改请求,添加缓存请求方法,将要发起的请求放到缓存中然后返回,使得相同请求使用同一个请求,等到返回数据后清除缓存。这种方式比较特殊,但能很好的解决问题,也不会产生过多的冗余代码。

具体使用见下方代码:

在axios中,添加

const cacheMap = {};

响应拦截添加

try {
  // 删除缓存
   const baseApi = res.config.url.replace(service.defaults.baseURL, "");
   let api;
   if (res.config.method === 'get') {
     api = baseApi + JSON.stringify(res.config.params);
   } else {
     api = baseApi + JSON.stringify(res.config.data);
   }
   if (cacheMap.hasOwnProperty(api)) {
     delete cacheMap[api];
   }
 } catch (err) {
 }

创建两个请求方法

/**
 * Get缓存请求
 */
export const cacheGet = async (api, params) => {
  if (api.indexOf("/") !== 0) {
    api = "/" + api;
  }
  const key = api + JSON.stringify(params);
  if (!cacheMap.hasOwnProperty(key)) {
    cacheMap[key] = service({
      url: api,
      method: 'get',
      params
    });
  }
  return cacheMap[key];
}

/**
 * Post缓存请求
 */
export const cachePost = async (api, data) => {
  if (api.indexOf("/") !== 0) {
    api = "/" + api;
  }
  const key = api + JSON.stringify(data);
  if (cacheMap.hasOwnProperty(key)) {
    cacheMap[key] = service({
      url: api,
      method: 'post',
      data
    });
  }
  return cacheMap[key];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会功夫的李白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值