JavaScript处理多个重复请求

一,问题产出

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

二、处理方式

  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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
处理Ajax重复请求时,可以采取以下几种解决方案。首先,可以使用主动查询状态的方式或工具函数的方式来去除重复操作。例如,可以在发送请求之前判断是否正在发送请求,如果是,则取消之前的请求。\[1\]在JavaScript中,可以使用XMLHttpRequest对象来发送Ajax请求,并通过设置一个标识变量来表示是否正在发送请求。当点击按钮时,可以先判断标识变量的值,如果为true,则取消之前的请求,然后再发送新的请求。\[2\]另外,还可以使用一个Set来存储正在执行中的请求,每次请求时先查询Set中是否已存在相同的请求,如果存在,则提示重复请求请求结束后,无论成功还是失败,都需要从Set中删除该请求。这样可以防止重复发送相同的请求。\[3\] #### 引用[.reference_title] - *1* [避免Ajax多次发送重复请求](https://blog.csdn.net/Crystalqy/article/details/79078741)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [解决重复发送AJAX请求问题](https://blog.csdn.net/qq_54255845/article/details/115560194)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [前端处理ajax重复请求的几种方式](https://blog.csdn.net/milugloomy/article/details/109502111)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值