背景

上一篇《JavaScript 阻塞方式实现异步任务队列》实现了异步请求依次执行的方案,实际上就是限制同一时间只能有一个异步请求,并发请求数为1。
那实现流量控制,怎么实现并发数大于1的情况呢?

方案

思路:

  • 使用Promise.all来保证并发数限制
  • 待Promise.all返回后再执行下一轮的Promise.all
  • 任务开启时,标记running状态为true
  • 队列中任务全部处理完后标志running状态为false

代码:

<body><button onclick="clickMe()">点我</button>
</body>
// 异步请求队列
const queue = []
// 用来模拟不同的返回值
let index = 0
// 标志是否正在处理队列中的请求
let running = false
// 异步请求并发数限制
const syncCount = 2// 使用setTimeout模拟异步请求
function request(index) {return new Promise(function (resolve) {setTimeout(() => {resolve(index)}, 1000)})
}// 连续点击,触发异步请求,加入任务队列
function clickMe() {addQueue(() => request(index++))
}// 当队列中任务数大于0时,开始处理队列中的任务
function addQueue(item) {queue.push(item)if (queue.length > 0 && !running) {running = trueprocessMulti(syncCount)}
}// 使用Promise.all来保证并发数限制
function processMulti(count) {const arr = []for (let i = 0; i < count; i++) {const item = queue.shift()item && arr.push(item())}if(arr.length > 0) {Promise.all(arr).then(res=>{console.log(res)processMulti(count)})} else {running = false}
}

效果

JavaScript实现异步请求并发数限制相关推荐

  1. 对请求并发数做限制的通用RequestDecorator

    使用场景 在开发中,我们可能会遇到一些对异步请求数做并发量限制的场景,比如说微信小程序的request并发最多为5个,又或者我们需要做一些批量处理的工作,可是我们又不想同时对服务器发出太多请求(可能会 ...

  2. 不到50行代码实现一个能对请求并发数做限制的通用RequestDecorator

    使用场景 在开发中,我们可能会遇到一些对异步请求数做并发量限制的场景,比如说微信小程序的request并发最多为5个,又或者我们需要做一些批量处理的工作,可是我们又不想同时对服务器发出太多请求(可能会 ...

  3. Exchange 2010 批量移动邮箱和增加移动请求并发数

    最近公司在准备升级 Exchange 服务,准备工作:把离职用户的邮箱,迁移到指定的数据库.在升级迁移数据库时,离职库不做迁移.这样能减少今后迁移的数据量. 增加移动请求并发数参考资料: https: ...

  4. 测试nignx php请求并发数,Nginx 高级篇(八)ab 压力测试即 nginx 的性能统计模块...

    我们总得要对自己的网站或者接口做压力测试的,总不能写好了代码不做测试就上线啊,谁知道你的网站或者接口能承受多少的并发和访问量,压力测试我们可以使用apache的ab小工具来搞或者使用github上提供 ...

  5. CHROME浏览器发送HTTP最大请求并发数限制

    一.先上结论: ①同一域名下,同一GET请求的并发数是1,也就是说上一个请求结束,才会执行下一个请求,否则置入队列等待发送: ②同一域名下,不同GET/POST请求的并发数量是6.当发送的请求数量达到 ...

  6. ajax请求return,细说JavaScript ajax异步请求return undefined

    在制作注册表单验证时我们需要通过ajax请求数据,例如我们需要请求数据库中的用户名判断是否存在,这时我们就需要return,再者我们很多时候需要使用数据库中的数据,这时我们也需要将数据返回出去. 我们 ...

  7. 测试nignx php请求并发数,nginx 优化(突破十万并发)

    一般来说nginx 配置文件中对优化比较有作用的为以下几项: worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数.worker_cpu_affini ...

  8. 并发请求多 服务器响应慢 post,【转】吞吐量、QPS(TPS)、并发数、RT性能指标及ab并发测试...

    概念 吞吐量 系统的吞吐量是指系统的抗压.负载能力,指的是单位时间内处理的请求数量.通常情况下,吞吐率用 "字节数/秒" 来衡量,也可以用 "请求数/秒",&q ...

  9. 异步请求积压可视化|如何 1 分钟内快速定位函数计算积压问题

    作者 | 千风 本文分为三个部分:概述中引入了积压问题,并介绍了函数计算异步调用基本链路:并在指标介绍部分详细介绍了指标查看方式,分类解读了不同的指标含义:最后以一个常见的异步请求积压场景为例,介绍如 ...

最新文章

  1. vsftpd服务安装与虚拟用户配置
  2. java 类 clone_Java Clone(类的复制)实例代码
  3. tkinter 笔记: radiobutton 选择按钮(莫烦python笔记)
  4. Spring Cache抽象-缓存管理器
  5. vscode多个光标_21 个VSCode 快捷键,让代码更快,更有趣
  6. 第四章:滚动堆栈(1)
  7. CodeForces - 1526D Kill Anton(模拟)
  8. HTML,CSS基础十大重点问题
  9. Web.py session用户认证
  10. 自定义admin组件,Xamin
  11. 登录时记住密码的实现
  12. 读《天才在左,疯子在右》01--偷取时间
  13. 【Golang】go语言实现数据结构——堆
  14. 基于随机森林的分类算法的matlab简单实现
  15. cc32a_demo-32dk2j_cpp_纯虚函数与抽象类-txwtech
  16. Android序列化经典解析(三)-拨乱反正,堪比窦娥的Serializable
  17. 使用BeautifulSoap爬取安智网的所有应用信息
  18. 【Android】之屏幕适配
  19. Excel如何将中文数字转为阿拉伯数字
  20. JAVA_HOME环境配置

热门文章

  1. 多路复用技术(频分多路复用、时分多路复用和波分多路复用)
  2. //编写一个学生类(Students),包括姓名(name)、性别(sex)、学号(num)、语文课(Chinese)、英语课(English)、 //数学课(Math)和平均值(avg)
  3. HSV色彩空间筛选 2021-10-06
  4. collection集合和源码
  5. libvirt介绍和使用
  6. robots xctf 攻防世界 web新手练习区
  7. 神经网络的具体应用实例,各种神经网络的应用
  8. 关于机器学习与人类学习不同点的思考
  9. ReXNet学习笔记 --- ReXNet: Diminishing Representational Bottleneck on Convolutional Neural Network
  10. Vs2010安装svn