iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >JS前端并发多个相同的请求怎么控制为只发一个请求
  • 263
分享到

JS前端并发多个相同的请求怎么控制为只发一个请求

2023-07-02 17:07:25 263人浏览 泡泡鱼
摘要

这篇文章主要讲解了“js前端并发多个相同的请求怎么控制为只发一个请求”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS前端并发多个相同的请求怎么控制为只发一个请求”吧!描述如下同时发多个相同

这篇文章主要讲解了“js前端并发多个相同的请求怎么控制为只发一个请求”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS前端并发多个相同的请求怎么控制为只发一个请求”吧!

描述如下

  • 同时发多个相同的请求,如果第一个请求成功,那么剩余的请求都不会发出,成功的结果作为剩余请求返回

  • 如果第一个请求失败了,那么接着发编号为2的请求,如果请求成功,那么剩余的请求都不会发出,成功的结果作为剩余请求返回

  • 如果第二个请求失败了,那么接着发编号为3的请求,如果请求成功,那么剩余的请求都不会发出,成功的结果作为剩余请求返回

  • ...以此递推,直到遇到最坏的情况需要发送最后一个请求

并发: 一个接口请求还处于pending,短时间内就发送相同的请求

async function fetchData (a)  {    const data = await fetch('//127.0.0.1:3000/test')    const d = await data.JSON();    console.log(d);    return d;}fetchData(2) // 编号 1fetchData(2) // 2fetchData(2) // 3fetchData(2) // 4fetchData(2) // 4fetchData(2) // 5fetchData(2)fetchData(2)

老版本cachedAsync

我之前使用过Vue缓存函数缓存成功的请求, 实现是这样的。下面的cachedAsync只会缓存成功的请求,如果失败了,直接拉起新的请求。但是如果是上面的并发场景,相同的请求因为无法命中缓存,会出现连续发送三个请求的问题,无法处理这种并发的场景。

const cachedAsync = function(fn) {    const cache = Object.create(null);    return async str => {        const hit = cache[str];        if (hit) {            return hit;        }        // 只缓存成功的Promise, 失败直接重新请求        return (cache[str] = await fn(str));    };};const fetch3 = cachedAsync(fetchData)fetch3(2);fetch3(2);fetch3(2);

进阶版本

首先缓存是必须的,那么我们只要处理怎么控制并发即可。可以有这么一个思路

  • 每个请求都返回一个新的Promise, Promise的exector的执行时机,通过一个队列保存。

  • 当队列长度为1的时候,执行一次请求,如果请求成功,那么遍历队列中的exector,拿到请求的结果然后resolve。

  • 如果请求失败了,那么就把这个Promise reject掉,同时出栈。然后递归调用next

  • 直到exector队列清空为止

  const cacheAsync = (promiseGenerator, symbol) => {    const cache = new Map();    const never = Symbol();    return async (params) => {      return new Promise((resolve, reject) => {      // 可以提供键值        symbol = symbol || params;        let cacheCfg = cache.get(symbol);        if (!cacheCfg) {          cacheCfg = {            hit: never,            exector: [{ resolve, reject }],          };          cache.set(symbol, cacheCfg);        } else {          // 命中缓存          if (cacheCfg.hit !== never) {            return resolve(cacheCfg.hit)          }          cacheCfg.exector.push({ resolve, reject });        }        const { exector } = cacheCfg;        // 处理并发,在请求还处于pending过程中就发起了相同的请求        // 拿第一个请求        if (exector.length === 1) {          const next = async () => {            try {              if (!exector.length) return;              const response = await promiseGenerator(params);              // 如果成功了,那么直接resolve掉剩余同样的请求              while (exector.length) { // 清空                exector.shift().resolve(response);               }              // 缓存结果              cacheCfg.hit = response;            } catch (error) {              // 如果失败了 那么这个promise的则为reject              const { reject } = exector.shift();              reject(error);              next(); // 失败重试,降级为串行            }          };          next();        }      });    };  };

测试cacheAsync

需要测试的场景

  • 请求接口随机出现成功或者失败

  • 成功预期结果,剩余的请求都不会发出

  • 失败重试,接着发下一个请求

快速搭建一个服务器

const koa = require("koa");const app = new koa();function sleep(seconds) { return new Promise((resolve, reject) => {   setTimeout(resolve, seconds); });}app.use(async (ctx, next) => { if (ctx.url === "/test") {   await sleep(200);   const n = Math.random();   // 随机挂掉接口   if (n > 0.8) {       ctx.body = n;   } else {       ctx.status = 404       ctx.body = ''   }   next(); }});app.listen(3000, "127.0.0.1", () => console.log("listening on 127.0.0.1:3000"));

客户端

  var fetch3 = cacheAsync(fetchData, "test2");  async function fetchData(a) {    const data = await fetch("//127.0.0.1:3000/test");    const d = await data.json();    console.log(d);    return d;  }   // 并发6个相同的请求  console.log(fetch3(2));  console.log(fetch3(2));  console.log(fetch3(2));  console.log(fetch3(2));  console.log(fetch3(2));  console.log(fetch3(2));

看下测试结果,刷新下页面

第一次运气很好,第一次接口就请求成功,只发送了一个请求

JS前端并发多个相同的请求怎么控制为只发一个请求

第二次测试运气不好,最后一个请求才成功,也是最差的场景

JS前端并发多个相同的请求怎么控制为只发一个请求

第三次测试,请求第三次成功了

JS前端并发多个相同的请求怎么控制为只发一个请求

测试下缓存 在控制台主动请求fetch3,成功命中。

JS前端并发多个相同的请求怎么控制为只发一个请求

从测试结果来看是正确的,符合了并发和缓存的场景。有人会问为什么要缓存接口,举个场景。输入关键字搜索,监听的是input事件,在你增删关键字的时候,就会出现请求参数一样的场景,这时候就符合防抖+前端接口缓存的方式。遇到相同关键字直接拉之前的缓存。

提示

这个缓存因为是闭包的方式,因此刷新页面缓存也失效了。不过我认为这个是理应如此,因为大部分场景刷新页面,就是要重置状态,如果要持久化,还不如保存到本地存储。

感谢各位的阅读,以上就是“JS前端并发多个相同的请求怎么控制为只发一个请求”的内容了,经过本文的学习后,相信大家对JS前端并发多个相同的请求怎么控制为只发一个请求这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: JS前端并发多个相同的请求怎么控制为只发一个请求

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

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

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

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

下载Word文档
猜你喜欢
  • JS前端并发多个相同的请求怎么控制为只发一个请求
    这篇文章主要讲解了“JS前端并发多个相同的请求怎么控制为只发一个请求”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS前端并发多个相同的请求怎么控制为只发一个请求”吧!描述如下同时发多个相同...
    99+
    2023-07-02
  • JS前端并发多个相同的请求控制为只发一个请求方式
    目录描述如下老版本cachedAsync进阶版本测试cacheAsync快速搭建一个服务器客户端提示描述如下 同时发多个相同的请求,如果第一个请求成功,那么剩余的请求都不会发出,成功...
    99+
    2024-04-02
  • 前端发起请求,后端响应请求的整个过程
    文章目录 前端注册页面axios 请求方法URL 路径配置自定义 axios方法封装 后端创建服务器模块接口方法模块连接数据库 本文分为:前端、后端两部分讲诉。以下是前端发送...
    99+
    2023-09-03
    前端 javascript vue.js node.js mysql
  • 怎么在JavaScript中使用Promise控制并发请求个数
    这篇文章给大家介绍怎么在JavaScript中使用Promise控制并发请求个数,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。串行:一个异步请求完了之后在进行下一个请求并行:多个异步请求同时进行串行举例:var&nbs...
    99+
    2023-06-15
  • python怎么并发上千个请求
    在Python中实现并发上千个请求有多种方法。以下是一些常用的方法: 使用多线程:可以使用threading模块创建和管理多个线程...
    99+
    2024-02-29
    python
  • JavaScript如何利用Promise控制并发请求个数
    一、场景 假设现在有这么一种场景:现有 30 个异步请求需要发送,但由于某些原因,我们必须将同一时刻并发请求数量控制在 5 个以内,同时还要尽可能快速的拿到响应结果。 如图所示: ...
    99+
    2024-04-02
  • 怎么在Java中发起一个http请求
    这期内容当中小编将会给大家带来有关怎么在Java中发起一个http请求,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、GET与POSTGET和POST是HTTP的两个常用方法。GET指从指定的服务器中获...
    99+
    2023-06-14
  • vue如何解决一个方法同时发送多个请求的问题
    这篇文章主要介绍了vue如何解决一个方法同时发送多个请求的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在...
    99+
    2024-04-02
  • 如何基于JS实现Ajax并发请求的控制详解
    目录前言 Ajax的串行与并行Ajax的并发请求控制的两大解决方案 基于Promise递归实现 基于Class实现 代码展示 总结 前言 最近看到一个面试题,当然了,就是这篇文章的...
    99+
    2024-04-02
  • jMeter中怎么发送两个逻辑相关的HTTP请求
    这期内容当中小编将会给大家带来有关jMeter中怎么发送两个逻辑相关的HTTP请求,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。现在我有另一个需求场景:假设我开发了一个创建Service Request的...
    99+
    2023-06-03
  • 如何让突发的多个请求等待第一个完成(分布式)
    大家好,我们又见面了啊~本文《如何让突发的多个请求等待第一个完成(分布式)》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们...
    99+
    2024-04-04
  • 前端开发中怎么处理AJAX请求的重复使用
    这篇文章给大家分享的是有关前端开发中怎么处理AJAX请求的重复使用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在开发前端时,我们经常使用AJAX来初始化数据并动态渲染在页面上,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作