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 相关文章推荐
JS 添加千分位与去掉千分位的示例
Jul 11 Javascript
动态载入js提高网页打开速度的方法
Jul 04 Javascript
基于ajax实现文件上传并显示进度条
Aug 03 Javascript
thinkphp实现无限分类(使用递归)
Dec 19 Javascript
js 声明数组和向数组中添加对象变量的简单实例
Jul 28 Javascript
Websocket协议详解及简单实例代码
Dec 12 Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
Dec 14 Javascript
JavaScript 跨域之POST实现方法
May 07 Javascript
解决Layui 表单提交数据为空的问题
Aug 15 Javascript
微信小程序性能优化之checkSession的使用
Mar 06 Javascript
Vue和React有哪些区别
Sep 12 Javascript
Vue常用API、高级API的相关总结
Feb 02 Vue.js
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迭代器实现斐波纳契数列的函数
2013/11/12 PHP
php使用websocket示例详解
2014/03/12 PHP
php实现算术验证码功能
2018/12/05 PHP
PHP使用phpunit进行单元测试示例
2019/09/23 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
Laravel登录失败次数限制的实现方法
2020/08/26 PHP
javascript下判断一个对象是否具有指定名称的属性的的代码
2010/01/11 Javascript
JS 各种网页尺寸判断实例方法
2013/04/18 Javascript
快速查找数组中的某个元素并返回下标示例
2013/09/03 Javascript
Js实现手机发送验证码时按钮延迟操作
2014/06/20 Javascript
jQuery验证插件 Validate详解
2014/11/20 Javascript
jQuery实现仿Google首页拖动效果的方法
2015/05/04 Javascript
js实现精美的银灰色竖排折叠菜单
2015/05/16 Javascript
基于WebUploader的文件上传js插件
2016/08/19 Javascript
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
2018/12/03 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
ES6 Promise对象的含义和基本用法分析
2019/06/14 Javascript
nodeJs的安装与npm全局环境变量的配置详解
2020/01/06 NodeJs
在Python中使用SimpleParse模块进行解析的教程
2015/04/11 Python
Python做简单的字符串匹配详解
2017/03/21 Python
基于hashlib模块--加密(详解)
2017/06/21 Python
Python中read()、readline()和readlines()三者间的区别和用法
2017/07/30 Python
基于python的字节编译详解
2017/09/20 Python
Windows系统下PhantomJS的安装和基本用法
2018/10/21 Python
python+openCV利用摄像头实现人员活动检测
2019/06/22 Python
python 日期排序的实例代码
2019/07/11 Python
Django上线部署之IIS的配置方法
2019/08/22 Python
numpy 声明空数组详解
2019/12/05 Python
浅析Python requests 模块
2020/10/09 Python
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
澳大利亚当地社区首选的光学商店:1001 Optical
2019/08/24 全球购物
介绍一下Java中的Class类
2015/04/10 面试题
高三自我鉴定怎么写
2013/10/19 职场文书
学校课外活动总结
2014/05/08 职场文书
2014年护理部工作总结
2014/11/14 职场文书
Python 数据可视化之Seaborn详解
2021/11/02 Python