iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript使用promise处理多重复请求
  • 784
分享到

JavaScript使用promise处理多重复请求

2024-04-02 19:04:59 784人浏览 薄情痞子
摘要

一、为什么要写这个文章? 处理重复请求的文章想必大家也看过了很多,大多数都是分为在response返回之前发现重复请求就return掉的和使用节流/防抖来间接规避用户频繁操作两种版

一、为什么要写这个文章?

处理重复请求的文章想必大家也看过了很多,大多数都是分为在response返回之前发现重复请求就return掉的和使用节流/防抖来间接规避用户频繁操作两种版本的。最近在使用的过程的中,发现这两个版本在某些场景下还是有些局限性。

二、问题场景

如图,我这个h5的页面,顶部和底部都要显示这个名片组件。这些名片的信息是通过一个接口来获取的,当这个组件在当前页面被初始化时,就会发生两次重复的请求。

这时会面临几个抉择:

1. 不对重复请求做任何处理。

  • 缺点1:造成不必要的资源浪费,增大服务器的压力
  • 缺点2:Http请求在浏览器中是有并发数限制的,如果页面首屏的请求较多且没有分层级加载的话,很容易造成请求阻塞,影响用户第一时间看到主要内容

2. 对重复请求直接return掉。这也是部分文章的做法,不过这种做法有种局限性,就是直接认定后面的重复请求均为无效请求。

  • 无效请求场景:用户点击了某个按钮进行查询或保存,在请求结果返回之前,后面点击基本都算是无效请求,这种请求就是应该被阻止的。当然,也可以通过在按钮上添加节流/防抖来规避这个问题
  • 为何不适用于目前场景:这两个名片的组件都是需要数据来渲染的,如果第二次重复的请求被return了,其中一个组件的名片就会没有数据。

3. 把请求从组件中抽离出来放到父级的业务页面中,再以props的方式传进组件。

  • 好处:只需要请求一次,两个组件就可以共享一份数据。
  • 局限性:只适用于单个业务页面用到的情况。事实上这个组件很多个业务页面在用,即使把请求的函数抽成公用的api,也是要在每个业务页面初始化的时候调用一次,然后再以props的方式传进组件。

三、解决方式

核心思想

  • 初始化一个handleList的数组
  • 在请求发送前,根据入参是否相同判断是否为重复请求
    • 非重复请求:把改请求的参数和请求返回的Promise添加至数组中
    • 重复请求:使用find查找直接返回对应的Promise
  • 请求完成后把handleList中之前添加的请求信息移除。

这个方案是什么都可以使用的,无论是使用axiOS、jq、fetch、小程序request。这里就写实现的原理,使用时直接把对应的代码放到对应的请求时机即可。

代码示例


let handleList = [] // 请求列表

const httpRequest = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(`请求成功,时间戳为:${new Date().getTime()}`)
    }, 1000)
  })
}

function requestTest(url, requestObj = {}) {
  // 因为入参一般不会涉及到复杂类型,JSON.stringify进行序列化对比其实够用了
  // 有个局限性就是入参的顺序改变了就会影响判断,不过这种特殊的改变一般在重复请求中不会出现
  // 实在是有这种需求的,换成其他递归对比的api,lodash也有类似的api
  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) => {
    httpRequest()
      .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
}

// *******************************我是华丽的分割线 开始使用*******************************
const params = {
  name: 'waldon'
}
requestTest('/ajax/sameUrl', params).then((res) => {
  console.log(`首次请求结果`, res)
  console.log(`handleList:`, handleList)
})
requestTest('/ajax/sameUrl', params).then((res) => {
  console.log(`重复请求结果`, res)
  console.log(`handleList:`, handleList) // 请求列表中始终只有一个请求
  setTimeout(() => {
    console.log(`请求完成后的handleList:`, handleList) // 请求完成handleList对应的请求会被清除
  }, 100)
})
setTimeout(() => {
  // 特意延迟500ms请求,因为我们设置了接口1s才返回,所以应该得到一样的结果
  requestTest('/ajax/sameUrl', params).then((res) => {
    console.log(`重复请求结果`, res)
    console.log(`handleList:`, handleList)
  })
}, 500)

输出结果

存在重复请求,直接返回
存在重复请求,直接返回
首次请求结果 请求成功,时间戳为:1621650375540
handleList: [
  {
    url: '/ajax/sameUrl',
    requestObj: { name: 'waldon' },
    handle: Promise { '请求成功,时间戳为:1621650375540' }
  }
]
重复请求结果 请求成功,时间戳为:1621650375540
handleList: [
  {
    url: '/ajax/sameUrl',
    requestObj: { name: 'waldon' },
    handle: Promise { '请求成功,时间戳为:1621650375540' }
  }
]
重复请求结果 请求成功,时间戳为:1621650375540
handleList: [
  {
    url: '/ajax/sameUrl',
    requestObj: { name: 'waldon' },
    handle: Promise { '请求成功,时间戳为:1621650375540' }
  }
]
请求完成后的handleList: []

代码地址 codepen

https://codepen.io/waldonUB/pen/ZEeeONM

注意的点

  • 不要对response中的数据进行增删操作。因为重复请求返回Promise中的对象引用地址都是同一个,改动了就会造成数据污染。特殊情况时可以浅拷贝响应结果再处理,或者是增加对应的断言。
  • 处理重复的请求时,最好在log中提示一下,同时在组件中注释好原因和使用场景,避免他人误改
  • 做好极端情况下,请求失败的处理,设置有效时间置空和移除请求信息,避免因为闭包堆积过多无用的请求信息造成内存泄漏。

到此这篇关于javascript使用promise处理多重复请求的文章就介绍到这了,更多相关js promise多重复请求内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JavaScript使用promise处理多重复请求

本文链接: https://www.lsjlt.com/news/126828.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript使用promise处理多重复请求
    一、为什么要写这个文章? 处理重复请求的文章想必大家也看过了很多,大多数都是分为在response返回之前发现重复请求就return掉的和使用节流/防抖来间接规避用户频繁操作两种版...
    99+
    2024-04-02
  • JavaScript使用Promise实现并发请求数限制
    目录没有Promise的并发请求使用Promise限制并发请求使用Promise实现并发请求数限制总结没有Promise的并发请求 在Web开发中,我们经常需要发起多个异步请求来获取...
    99+
    2023-05-16
    JavaScript Promise并发请求限制 Promise限制并发请求 JS promise限制并发
  • JavaScript怎么使用Promise实现并发请求数限制
    本篇内容主要讲解“JavaScript怎么使用Promise实现并发请求数限制”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript怎么使用Promise实现并发请求数限制”吧!没有...
    99+
    2023-07-06
  • 前端开发中怎么处理AJAX请求的重复使用
    这篇文章给大家分享的是有关前端开发中怎么处理AJAX请求的重复使用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在开发前端时,我们经常使用AJAX来初始化数据并动态渲染在页面上,...
    99+
    2024-04-02
  • 怎么在JavaScript中使用Promise控制并发请求个数
    这篇文章给大家介绍怎么在JavaScript中使用Promise控制并发请求个数,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。串行:一个异步请求完了之后在进行下一个请求并行:多个异步请求同时进行串行举例:var&nbs...
    99+
    2023-06-15
  • angular.js4如何使用RxJS处理多个Http请求
    这篇文章将为大家详细讲解有关angular.js4如何使用RxJS处理多个Http请求,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。有时候进入某个页面时,我们需要从多个 ...
    99+
    2024-04-02
  • JavaScript如何利用Promise控制并发请求个数
    一、场景 假设现在有这么一种场景:现有 30 个异步请求需要发送,但由于某些原因,我们必须将同一时刻并发请求数量控制在 5 个以内,同时还要尽可能快速的拿到响应结果。 如图所示: ...
    99+
    2024-04-02
  • 项目中如何使用axios过滤多次重复请求
    这篇文章主要讲解了“项目中如何使用axios过滤多次重复请求”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“项目中如何使用axios过滤多次重复请求”吧!目录一、前言:这个情况下,我们通常的做...
    99+
    2023-06-20
  • JavaScript怎么处理并行请求
    这篇文章主要讲解了“JavaScript怎么处理并行请求”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript怎么处理并行请求”吧!需求两个异步...
    99+
    2024-04-02
  • 使用 Go 处理 post 请求中的多个文件
    Golang不知道大家是否熟悉?今天我将给大家介绍《使用 Go 处理 post 请求中的多个文件》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能...
    99+
    2024-04-04
  • redis如何处理多个请求
    Redis处理多个请求的方式主要有两种: 顺序处理:Redis是单线程的,它会按照请求的顺序依次处理每个请求。当有多个请求同时到...
    99+
    2024-04-03
    redis
  • JavaScript中怎么处理并行请求
    JavaScript中怎么处理并行请求,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、使用Promise.allconst startTime&nb...
    99+
    2023-06-20
  • 项目中如何使用axios过滤多次重复请求详解
    目录一、前言:这个情况下,我们通常的做法有两种:二、CancelToken类最终效果总结一、前言: 我们在web应用开发过程当中,经常会遇到一个时刻发起了多个请求的场景 这个情况...
    99+
    2024-04-02
  • SpringBoot能同时处理多少请求
    这篇文章主要介绍“SpringBoot能同时处理多少请求”,在日常操作中,相信很多人在SpringBoot能同时处理多少请求问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringBoot能同时处理多少请求...
    99+
    2023-07-05
  • 如何使用Servlet处理AJAX请求
    本文小编为大家详细介绍“如何使用Servlet处理AJAX请求”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何使用Servlet处理AJAX请求”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起...
    99+
    2024-04-02
  • JavaScript如何使用Array.includes来处理多重条件
    小编给大家分享一下JavaScript如何使用Array.includes来处理多重条件,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!使用 Array.includes 来处理多重条件举个...
    99+
    2024-04-02
  • 如何处理HTTP请求中重复状态码的情况
    如何处理HTTP请求中重复状态码的情况 HTTP是一种用于传输超文本的协议,在网页浏览、数据交互等场景中被广泛使用。在进行HTTP请求时,服务器会返回一个状态码来表示请求的处理结果。然...
    99+
    2024-02-22
    http请求 处理方法 重复状态码
  • 如何使用 ASP 和 numpy 重定向来处理并发请求?
    当我们需要同时处理多个请求时,如何有效地处理这些请求是一个非常重要的问题。在这篇文章中,我们将介绍如何使用 ASP 和 numpy 重定向来处理并发请求,以提高系统的效率和性能。 ASP 是一种动态网页开发技术,它可以处理和生成动态内容,...
    99+
    2023-08-19
    并发 numpy 重定向
  • java怎么使用队列处理请求
    在Java中,可以使用Queue接口的实现类来处理请求。Queue是Java集合框架中定义的一个接口,表示队列的数据结构。其中常用的...
    99+
    2023-08-18
    java
  • ASP 中如何处理多个客户端同时请求的重定向?
    在ASP应用程序中,有时候需要将用户请求重定向到另一个页面或者网站。这个过程通常是通过向客户端发送一个HTTP重定向响应来实现的。然而,在多个客户端同时请求时,可能会出现一些问题,比如多个客户端同时请求同一个页面,但是只有一个客户端能够成...
    99+
    2023-07-03
    同步 重定向 并发
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作