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 相关文章推荐
JavaScript Cookie显示用户上次访问的时间和次数
Dec 08 Javascript
javascript 用记忆函数快速计算递归函数
Mar 15 Javascript
jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
Jun 28 Javascript
JavaScript 错误处理与调试经验总结
Aug 10 Javascript
arcgis for js 修改infowindow样式的方法
Nov 02 Javascript
Extjs gridpanel 中的checkbox(复选框)根据某行的条件不能选中的解决方法
Feb 17 Javascript
深入理解在JS中通过四种设置事件处理程序的方法
Mar 02 Javascript
echarts实现词云自定义形状的示例代码
Feb 20 Javascript
Node.js Windows Binary二进制文件安装方法
May 16 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
Sep 06 Javascript
layui实现把数据表格时间戳转换为时间格式的例子
Sep 12 Javascript
JS代码简洁方式之函数方法详解
Jul 28 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+javascript模拟Matrix画面
2006/10/09 PHP
php轻松实现中英文混排字符串截取
2014/05/28 PHP
PHP传参之传值与传址的区别
2015/04/24 PHP
php+curl 发送图片处理代码分享
2015/07/09 PHP
PHP中spl_autoload_register()函数用法实例详解
2016/07/18 PHP
PHP CURL中传递cookie的方法步骤
2019/05/09 PHP
javascript 鼠标滚轮事件
2009/04/09 Javascript
jQuery 使用手册(三)
2009/09/23 Javascript
jquery 页面全选框实践代码
2010/04/02 Javascript
nodejs实用示例 缩址还原
2010/12/28 NodeJs
jquery toolbar与网页浮动工具条具体实现代码
2014/01/12 Javascript
[原创]推荐10款最热门jQuery UI框架
2014/08/19 Javascript
JS+CSS实现闪烁字体效果代码
2016/04/05 Javascript
AngularJS ng-mousedown 指令
2016/08/02 Javascript
Jquery Easyui自定义下拉框组件使用详解(21)
2020/12/31 Javascript
jquery中封装函数传递当前元素的方法示例
2017/05/05 jQuery
微信小程序之页面拦截器的示例代码
2017/09/07 Javascript
JavaScript之解构赋值的理解
2019/01/30 Javascript
基于vue和bootstrap实现简单留言板功能
2020/05/30 Javascript
微信小程序12行js代码自己写个滑块功能(推荐)
2020/07/15 Javascript
[34:39]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第二局
2016/03/05 DOTA
Python实现Windows上气泡提醒效果的方法
2015/06/03 Python
基于python的Tkinter实现一个简易计算器
2015/12/31 Python
Python实现识别手写数字大纲
2018/01/29 Python
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
2018/07/27 Python
用xpath获取指定标签下的所有text的实例
2019/01/02 Python
Python八皇后问题解答过程详解
2019/07/29 Python
在 Jupyter 中重新导入特定的 Python 文件(场景分析)
2019/10/27 Python
python每5分钟从kafka中提取数据的例子
2019/12/23 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
2021/01/01 Python
老公保证书范文
2014/04/29 职场文书
监督检查工作方案
2014/05/28 职场文书
如何签定毕业生就业协议书
2014/09/28 职场文书
群众路线教师自我剖析材料
2014/09/29 职场文书
2014年外贸业务员工作总结
2014/12/11 职场文书