JavaScript处理多个重复请求

本文探讨了在前端开发中如何处理重复HTTP请求的问题,指出不处理重复请求可能导致资源浪费和请求阻塞。提出了一种解决方案,即通过初始化请求列表,检查待发送请求是否已存在,从而决定是否返回现有Promise或发起新请求。这种方法能够有效地减少无效请求,提高用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,问题产出

我们在不同组件出来多次重复的请求,地址,参数相同

二、处理方式

  1. 不对重复请求做处理;
    •  缺点1:造成不必要的资源浪费,增大服务器的压力。
    •  缺点2:http请求在浏览器中有并发数限制的 ,如果页面首屏请求较多没有分层级加载 的话,很容易造成请求阻塞,影响用户第一时间看到页面内容。
  2. 对重复请求直接return掉,这种做法有局限性,就是直接认定后面的重复请求均为无效请求
    1. 无效请求场景:点击某个按钮进行查询或者保存操作,在请求结果返回之前,后面点基本都算是无效请求,这种请求应该被阻止。当然,也可以通过节流/防抖来规避这个问题。
    2. 什么时候不适用于此方法,请求之后页面需要展示页面。

三、解决方式

  1. 初始化一个数组;
  2. 在请求发送前,根据入参是否相同判断是否为重复请求
    1. 非重复请求,把请求的参数和请求返回的Promise添加至数组中
    2. 重复请求,使用find查找直接返回对应的Promise
  3. 请求完成后把数组中之前添加的请求信息移除
let handleList = [] //请求列表

/*
 *请求相关处理
 *@params url
 *@params requestObj  请求参数
 *@return {Promise} 请求的promise
 */
function request(url,requestObj={}){
    const sameHandle = handleList.find(
    (item) => item.url === url && JSON.stringify(item.requestObj) === JSON.stringify(requestObj)
  )
  if (sameHandle) {
    // 遇到相同请求直接返回之前请求的promise
    console.log(`存在重复请求,直接返回`)
    return sameHandle.handle
  }
  const handle = new Promise((resolve, reject) => {
    new Promise.resolve()
      .then((res) => {
        resolve(res)
      })
      .catch((err) => {
        reject(err)
      })
      .finally(() => {
        // 无论请求结果如果,都需要把对应的请求移除掉
        handleList = handleList.filter(
              (item) =>
                item.url !== url && JSON.stringify(item.requestObj) !== JSON.stringify(requestObj)
            )
      })
  })
  handleList.push({ url, requestObj, handle })
  return handle
}

参考文章,谢谢此朋友的方法,很好用

https://www.jb51.net/article/213282.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值