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中如何通过arguments对象实现对象的重载
May 12 Javascript
Js+Jq获取URL参数的集中方法示例代码
May 20 Javascript
jQuery表单域选择器用法分析
Feb 10 Javascript
js实现可得到不同颜色值的颜色选择器实例
Feb 28 Javascript
JavaScript显示当前文档最后修改日期的方法
Mar 19 Javascript
AngularJS进行性能调优的7个建议
Dec 28 Javascript
值得学习的bootstrap fileinput文件上传工具
Nov 08 Javascript
JS Select下拉框(支持输入模糊查询)
Feb 04 Javascript
Javascript 一些需要注意的细节(必看篇)
Jul 08 Javascript
从parcel.js打包出错到选择nvm的全部过程
Jan 23 Javascript
微信小程序自定义音乐进度条的实例代码
Aug 28 Javascript
js实现录音上传功能
Nov 22 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
体育彩票排列三组选三算法分享
2014/03/07 PHP
destoon在各个服务器下设置URL Rewrite(伪静态)的方法
2014/06/21 Servers
php中实现xml与mysql数据相互转换的方法
2014/12/25 PHP
phpStudy vscode 搭建debug调试的教程详解
2020/07/28 PHP
PHP实现倒计时功能
2020/11/16 PHP
js 禁用只读文本框获得焦点时的退格键
2010/04/25 Javascript
js用Date对象的setDate()函数对日期进行加减操作
2014/09/18 Javascript
基于jquery实现瀑布流布局
2020/06/28 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
2016/05/24 Javascript
BootStrapValidator校验方式
2016/12/19 Javascript
vue实现ToDoList简单实例
2017/02/07 Javascript
基于JS实现移动端向左滑动出现删除按钮功能
2017/02/22 Javascript
AngularJS实现表格的增删改查(仅限前端)
2017/07/04 Javascript
jQuery实现用户信息表格的添加和删除功能
2017/09/12 jQuery
Node.JS 循环递归复制文件夹目录及其子文件夹下的所有文件
2017/09/18 Javascript
layui获取选中行数据的实例讲解
2018/08/19 Javascript
express框架下使用session的方法
2019/07/31 Javascript
create-react-app中添加less支持的实现
2019/11/15 Javascript
JQuery复选框全选效果如何实现
2020/05/08 jQuery
原生js 实现表单验证功能
2021/02/08 Javascript
Python(TensorFlow框架)实现手写数字识别系统的方法
2018/05/29 Python
python issubclass 和 isinstance函数
2019/07/25 Python
使用Python为中秋节绘制一块美味的月饼
2019/09/11 Python
pytorch 实现查看网络中的参数
2020/01/06 Python
opencv 阈值分割的具体使用
2020/07/08 Python
需要知道的CSS3动画技术
2010/01/01 HTML / CSS
德国童装购物网站:NICKI´S.com
2018/04/20 全球购物
分解成质因数(如435234=251*17*17*3*2,据说是华为笔试题)
2014/07/16 面试题
《月迹》教学反思
2014/02/19 职场文书
对标管理实施方案
2014/03/12 职场文书
主持人演讲稿
2014/05/13 职场文书
社会工作专业自荐信
2014/09/26 职场文书
2015年英语教师工作总结
2015/05/20 职场文书
Z-Order加速Hudi大规模数据集方案分析
2022/03/31 Servers
Python图像处理库PIL详细使用说明
2022/04/06 Python
Java中API的使用方法详情
2022/04/06 Java/Android