JavaScript实现指定数量的并发限制的示例代码


Posted in Javascript onMarch 10, 2020

在网上看到这么一道题:

JavaScript实现指定数量的并发限制的示例代码

这道题跟鱼头这篇记录『什么是时间分片(Time Slicing)? 』有点相似,但不同的是这次是限制异步并发的数量。

所以话不多说,我们先来康康实现

首先我们来实现一个分割数组的函数~

const group = (list = [], max = 0) => {
  if (!list.length) {
    return list
  }
  let results = []
  for (let i = 0, len = list.length; i < len; i += max) {
    results.push(list.slice(i, i + max))
  }
  return results
}

这里就是根据指定的并发数量来分割数组。主要就是 for + slice ,这没啥好说的

接下来我们再来一个用 async + await 实现的请求集合封装。

我们通过 for...of 去遍历每一个异步函数,然后用 async + await 确保函数的执行顺序,再用 try...catch 来保证即使 reject 报错也不会导致无法继续执行任务。

const requestHandler = async (
  groupedUrl = [],
  callback = () => { }
) => {
  if (!groupedUrl.length) {
    callback()
    return groupedUrl
  }
  const newGroupedUrl = groupedUrl.map(fn => fn())
  const resultsMapper = (results) => results.map(callback)
  const data = await Promise.allSettled(newGroupedUrl).then(resultsMapper)
  return data;
}

接下来就是主函数

const sendRequest = async (
  urls = [],
  max = 0,
  callback = () => { }
) => {
  if (!urls.length) {
    return urls
  }
  const groupedUrls = group(urls, max)
  const results = []
  console.log('start !')
  for (let groupedUrl of groupedUrls) {
    try {
      const result = await requestHandler(groupedUrl, callback)
      results.push(result)
      console.log('go')
    } catch { }
  }
  console.log('done !')
  return results
}

这里就是利用了 for + async + await 来限制并发。等每次并发任务结果出来之后再执行下一次的任务。

我们执行下栗子:

const p1 = () => new Promise((resolve, reject) => setTimeout(reject, 1000, 'p1'))
const p2 = () => Promise.resolve(2)
const p3 = () => new Promise((resolve, reject) => setTimeout(resolve, 2000, 'p3'))
const p4 = () => Promise.resolve(4)
const p5 = () => new Promise((resolve, reject) => setTimeout(reject, 2000, 'p5'))
const p6 = () => Promise.resolve(6)
const p7 = () => new Promise((resolve, reject) => setTimeout(resolve, 1000, 'p7'))
const p8 = () => Promise.resolve(8)
const p9 = () => new Promise((resolve, reject) => setTimeout(reject, 1000, 'p9'))
const p10 = () => Promise.resolve(10)
const p11 = () => new Promise((resolve, reject) => setTimeout(resolve, 2000, 'p10'))
const p12 = () => Promise.resolve(12)
const p13 = () => new Promise((resolve, reject) => setTimeout(reject, 1000, 'p11'))
const p14 = () => Promise.resolve(14)

const ps = [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14]
sendRequest(ps, 3, ({reason, value}) => {
  console.log(reason || value)
})

JavaScript实现指定数量的并发限制的示例代码

OK,我们看到结果是如我们所愿的

到此这篇关于JavaScript实现指定数量的并发限制的示例代码的文章就介绍到这了,更多相关JavaScript 指定数量并发限制内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
ext 代码生成器
Aug 07 Javascript
jQuery 使用手册(四)
Sep 23 Javascript
js中parseFloat(参数1,参数2)定义和用法及注意事项
Jan 27 Javascript
jquery实现textarea输入字符控制(仿微博输入控制字符)
Apr 26 Javascript
javascript中全局对象的parseInt()方法使用介绍
Dec 19 Javascript
深入浅析javascript立即执行函数
Oct 23 Javascript
学习JavaScript设计模式(链式调用)
Nov 26 Javascript
基于javascript实现根据身份证号码识别性别和年龄
Jan 22 Javascript
JQuery中解决重复动画的方法
Oct 17 Javascript
JQuery统计input和textarea文字输入数量(代码分享)
Dec 29 Javascript
jQuery读取XML文件的方法示例
Feb 03 Javascript
JavaScript一元正号运算符示例代码
Jun 30 Javascript
vue中的使用token的方法示例
Mar 10 #Javascript
vue瀑布流组件实现上拉加载更多
Mar 10 #Javascript
JS如何在数组指定位置插入元素
Mar 10 #Javascript
vue实现简单瀑布流布局
May 28 #Javascript
JavaScript观察者模式原理与用法实例详解
Mar 10 #Javascript
微信小程序用canvas画图并分享
Mar 09 #Javascript
JavaScript实现简单贪吃蛇效果
Mar 09 #Javascript
You might like
php生成动态验证码gif图片
2015/10/19 PHP
Yii2基于Ajax自动获取表单数据的方法
2016/08/10 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
2017/06/06 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
2019/07/06 PHP
用Javascript实现Windows任务管理器的代码
2012/03/27 Javascript
巧用jquery解决下拉菜单被Div遮挡的相关问题
2014/02/13 Javascript
js判断iframe内的网页是否滚动到底部触发事件
2014/03/18 Javascript
javascript中的throttle和debounce浅析
2014/06/06 Javascript
基于jquery和svg实现超炫酷的动画特效
2014/12/09 Javascript
jquery UI Datepicker时间控件的使用方法(基础版)
2015/11/07 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
分享几种比较简单实用的JavaScript tabel切换
2015/12/31 Javascript
JavaScript 不支持 indexof 该如何解决
2016/03/30 Javascript
jQuery 选择同时包含两个class的元素的实现方法
2016/06/01 Javascript
AngularJS操作键值对象类似java的hashmap(填坑小结)
2016/11/12 Javascript
javascript数据类型详解
2017/02/07 Javascript
谈谈VUE种methods watch和compute的区别和联系
2017/08/01 Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
2018/04/19 jQuery
ionic+html5+API实现双击返回键退出应用
2019/09/17 Javascript
js定时器出现第一次延迟的原因及解决方法
2021/01/04 Javascript
python实现的登陆Discuz!论坛通用代码分享
2014/07/11 Python
Python实现快速排序算法及去重的快速排序的简单示例
2016/06/26 Python
Python数据分析之双色球中蓝红球分析统计示例
2018/02/03 Python
python3中获取文件当前绝对路径的两种方法
2018/04/26 Python
pycharm下pyqt4安装及环境配置的教程
2020/04/24 Python
python 绘制正态曲线的示例
2020/09/24 Python
英国健身仓库:Bodybuilding Warehouse
2019/03/06 全球购物
Glamest意大利:女性在线奢侈品零售店
2019/04/28 全球购物
技术总监个人的自我评价范文
2013/12/18 职场文书
捐款倡议书格式范文
2014/05/14 职场文书
环保小标语
2014/06/13 职场文书
局领导领导班子四风对照检查材料
2014/09/27 职场文书
2014年圣诞节寄语
2014/12/08 职场文书
硕士学位论文评语
2014/12/31 职场文书
2021-4-5课程——SQL Server查询【3】
2021/04/05 SQL Server