js-妙用代理模式解决对api接口进行防抖节流

本文介绍了一种在项目上线后为避免大量重复请求,通过封装axios并添加请求过滤器的方法来实现接口的防抖和节流。在不修改原有接口的情况下,通过代理请求并在内存中存储请求的Promise,避免了对同一请求的多次调用,同时确保了请求的唯一性和资源的高效利用。
摘要由CSDN通过智能技术生成

背景:项目中因为开发的时候没有使用防抖节流进行接口访问控制,导致正式上线运行的时候同一个请求调用多次。因为项目体量较大,逐个接口去改风险太大,成本较高,所以最终决定在真正调用axios的地方进行方法代理。 

// 对axios的封装
const http = {
  get(url,params){
    return axios.get(`${url}`, {
      params: params
    })
  }
}
/**
 * 请求过滤器,减少重复的请求
 */
const requestFilter = {
  requests: {},// 存储所有的request的promise
  wrapped: (args, targetFun) => {
    let targetPromise = undefined;
    let md5 = undefined;
    const _args = [];
    if (args) {
      // 将arguments 转换成为json 然后获取校验码
      for (let i = 0; i < args.length; i++) {
        _args.push(args[i]);
      }
      // 这里可以通过使用md5进行签名,生成一个短一点的键
      md5 =  JSON.stringify(_args);
      targetPromise = requestFilter.requests[md5];
    }
    if (!targetPromise) {
      targetPromise = targetFun.call(http, ..._args);
      if (md5) {
        requestFilter.requests[md5] = targetPromise;
      }
    }
    return new Promise((resolve, reject) => {
      targetPromise.then(resp => {
        resolve(resp);
      }).catch(err => {
        reject(err);
      }).finally(() => {
        setTimeout(() => {
          delete requestFilter.requests[md5];
        }, 0);
      });
    })
      ;
  }
};
// 需要增强的函数名称
const wrappedFuns = ["get"];
wrappedFuns.forEach(funName => {
  const _fun = http[funName];
  http[funName] = function() {
    return requestFilter.wrapped(arguments, _fun);
  };
});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值