js异步接口并发数量控制的方法示例


Posted in Javascript onNovember 22, 2020

请实现如下的函数(发请求的函数可以直接使用fetch)

  1. 可以批量请求数据,所有的URL地址在urls参数中
  2. 同时可以通过max参数 控制请求的并发度
  3. 当所有的请求结束后,需要执行callback回调
function sendRequest (urls: string[], max: number, callback: () => void) {}

fetch 函数返回的是一个promise,promise对象在实例化的时候就已经开始执行了。

简易实现

function fetch(url) {
 // 模拟接口请求
 return new Promise(resolve => {
   setTimeout(() => {
     resolve(url)
   }, 10000*Math.random())
 })
}

/**
 * 接口请求最大并发量控制
 * @param { Array } urls 接口请求地址数组集合
 * @param { Number } max 最大并发量
 * @param { Function } callback 回调函数 
 */
function maxRequestLimit(urls, max, callback) {
 // 如果没有传入urls或max则不继续执行
 if (!urls || !max) return

 // 当请求地址数组集合长度为0,则执行回调函数(如果有的话),并结束后续执行
 if(urls.length === 0) {
   if(callback) callback()
   return
 }
 
 // 使用splice方法返回当前要使用的请求集合,同时删除原有的请求集合
 const onceMaxUrlArr = urls.splice(0, max)

 // 进行map转换,将url参数转换为promise
 const onceMaxFetchArr = onceMaxUrlArr.map(url => fetch(url))

 // 使用当前这一队列
 Promise.all(onceMaxFetchArr)
 .then(res => {
  console.log(res)
  // 递归请求
  maxRequestLimit(urls, max, callback)
 })
}

maxRequestLimit(['url1', 'url2', 'url3', 'url4', 'url5', 'url6', 'url7', 'url8'], 3, () => {console.log('fetch end')})

上面的简易实现是一个队列一个队列进行请求,实际运行效果会存在一定的阻塞,下面通过进一步改善来提高请求的效率

完善实现

function fetch(url) {
 // 模拟接口请求
 return new Promise(resolve => {
  setTimeout(() => {
   resolve(url)
  }, 10000 * Math.random())
 })
}

/**
 * 接口请求最大并发量控制
 * @param { Array } urls 接口请求地址数组集合
 * @param { Number } max 最大并发量
 * @param { Function } callback 回调函数 
 */
function maxRequestLimit(arr, max, callback) {
 // 如果没有传入urls或max则不继续执行
 if (!arr || !max) return

 // 当请求地址数组集合长度为0,则执行回调函数(如果有的话),并结束后续执行
 if(arr.length === 0) {
   if(callback) callback()
   return
 }

 let fetchArr = [], // 存储并发max的promise数组
  i = 0;

 function toFetch() {
  // 所有的请求都受理,则返回一个resolve
  if (i === arr.length) return Promise.resolve()

  // 取出第i个url, 放入fetch里面 , 每取一次i++
  let one = fetch(arr[i++]) 

  //将当前的promise存入并发数组中
  fetchArr.push(one) 

  // 当promise执行完毕后,从数组删除
  one.then(res => { 
   console.log(res)
   fetchArr.splice(fetchArr.indexOf(one), 1) 
  }) 

  let p = Promise.resolve()

  // 当并行数量达到最大后, 用race比较 第一个完成的, 然后再调用一下函数自身。
  if (fetchArr.length >= max) p = Promise.race(fetchArr)

  return p.then(() => toFetch())
 }

 // arr循环完后, 现在fetchArr里面剩下的promise对象, 使用all等待所有的都完成之后执行callback
 toFetch()
 .then(() => Promise.all(fetchArr))
 .then(() => callback())
}


maxRequestLimit(['url1', 'url2', 'url3', 'url4', 'url5', 'url6', 'url7', 'url8'], 3, () => { console.log('fetch end') })

总结

到此这篇关于js异步接口并发数量控制的文章就介绍到这了,更多相关js异步接口并发数量控制内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JS面向对象编程浅析
Aug 28 Javascript
js实现的折叠导航示例
Nov 29 Javascript
我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
Jul 06 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
Dec 29 Javascript
JavaScript代码轻松实现网页内容禁止复制(代码简单)
Oct 23 Javascript
详解微信小程序 页面跳转 传递参数
Dec 08 Javascript
jQuery中值得注意的trigger方法浅析
Dec 12 Javascript
vue.js将unix时间戳转换为自定义时间格式
Jan 03 Javascript
Bootstarp基本模版学习教程
Feb 01 Javascript
Javascript中数组去重与拍平的方法示例
Feb 03 Javascript
在vue项目中引入vue-beauty操作方法
Feb 11 Javascript
vue实现购物车的小练习
Dec 21 Vue.js
Vue实现购物小球抛物线的方法实例
Nov 22 #Vue.js
ES6学习教程之Promise用法详解
Nov 22 #Javascript
Node.js文本文件BOM头的去除方法
Nov 22 #Javascript
JavaScript手写数组的常用函数总结
Nov 22 #Javascript
JavaScript实现点击图片换背景
Nov 20 #Javascript
JavaScript实现鼠标经过表格某行时此行变色
Nov 20 #Javascript
JavaScript实现复选框全选和取消全选
Nov 20 #Javascript
You might like
如何重写Laravel异常处理类详解
2020/12/20 PHP
在线编辑器中换行与内容自动提取
2009/04/24 Javascript
javascript AOP 实现ajax回调函数使用比较方便
2010/11/20 Javascript
dojo学习第二天 ajax异步请求之绑定列表
2011/08/29 Javascript
基于jquery实现后台左侧菜单点击上下滑动显示
2013/04/11 Javascript
解析使用js判断只能输入数字、字母等验证的方法(总结)
2013/05/14 Javascript
Javascript中匿名函数的多种调用方式总结
2013/12/06 Javascript
JQuery radio(单选按钮)操作方法汇总
2015/04/15 Javascript
动态创建按钮的JavaScript代码
2016/01/29 Javascript
JQuery控制图片由中心点逐渐放大效果
2016/06/26 Javascript
JavaScript判断浏览器和hack滚动条的写法
2017/07/23 Javascript
简单谈谈JS中的正则表达式
2017/09/11 Javascript
重新认识vue之事件阻止冒泡的实现
2018/08/02 Javascript
详解如何在webpack中做预渲染降低首屏空白时间
2018/08/22 Javascript
深入了解JavaScript 防抖和节流
2019/09/12 Javascript
vue相同路由跳转强制刷新该路由组件操作
2020/08/05 Javascript
跟老齐学Python之大话题小函数(2)
2014/10/10 Python
八大排序算法的Python实现
2021/01/28 Python
Python编程django实现同一个ip十分钟内只能注册一次
2017/11/03 Python
python将文本分每两行一组并保存到文件
2018/03/19 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
2019/08/17 Python
通过实例解析Python return运行原理
2020/03/04 Python
Django自定义全局403、404、500错误页面的示例代码
2020/03/08 Python
matplotlib基础绘图命令之bar的使用方法
2020/08/13 Python
CSS3使用多列制作瀑布流
2016/05/10 HTML / CSS
详解H5本地储存Web Storage
2017/07/03 HTML / CSS
瑞典Happy Socks美国官网:购买色彩斑斓的快乐袜子
2016/10/19 全球购物
美国在线轮胎零售商:SimpleTire
2019/04/08 全球购物
争论的故事教学反思
2014/02/06 职场文书
销售求职信范文
2014/05/26 职场文书
2015年保安个人工作总结
2015/04/02 职场文书
庆祝教师节主持词
2015/07/06 职场文书
教师病假条范文
2015/08/17 职场文书
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python
Win11怎样将锁屏账户头像图片改成动画视频
2021/11/21 数码科技
分享提高 Python 代码的可读性的技巧
2022/03/03 Python