文章目录

  • Promise.all 的简单解释:
  • 需求解释
  • 设计思路
  • 代码实现

Promise.all 的简单解释:

// 当以下数组中promise1, promise2, promise3都resolve之后,触发promise.all的then函数。
Promise.all([promise1, promise2, promise3]).then((values) => {console.log(values);
});

需求解释

所谓并发请求,即有待请求接口100个,限制每次只能发出10个。即同一时刻最多有10个正在发送的请求。

每当10个之中有一个请求完成,则从待请求的接口中再取出一个发出。保证当前并发度仍旧为10。

直至最终请求完成。

设计思路

简单思路如下:(假设并发请求函数名字为limitedRequest)

  • 设定一个数组(命名为:pool),用于后续Promise.all的使用
  • 当limitedRequest被调用的时候,首先一次性发出10个请求,并放入到pool中
  • 每一个请求完成后的回调函数中继续触发下一个请求,而下一个请求返回Promise,他的回调函数继续绑定同样的回调函数,即循环调用。(看不懂就直接看代码更易懂)
  • 直到全部请求完成,停止。

代码实现

具体代码如下

// 模仿一个fetch的异步函数,返回promise
function mockFetch(param) {return new Promise((resovle) => {setTimeout(() => {resovle(param);}, 2000);});
}function limitedRequest(urls, maxNum) {const pool = [];// 处理maxNum比urls.length 还要大的情况。const initSize = Math.min(urls.length, maxNum);for (let i = 0; i < initSize; i++) {// 一次性放入初始的个数pool.push(run(urls.splice(0, 1)));}// r 代表promise完成的resolve回调函数// r 函数无论什么样的结果都返回promise,来确保最终promise.all可以正确执行function r() {console.log('当前并发度:', pool.length);if (urls.length === 0) {console.log('并发请求已经全部发起');return Promise.resolve();}return run(urls.splice(0, 1));}// 调用一次请求function run(url) {return mockFetch(url).then(r);}// 全部请求完成的回调Promise.all(pool).then(() => {console.log('请求已经全部结束');});
}
// 函数调用
limitedRequest([1, 2, 3, 4, 5, 6, 7, 8], 3);
# 最终返回结果
$ node .\src\views\doc\detail\index.js
当前并发度: 3
当前并发度: 3
当前并发度: 3
当前并发度: 3
当前并发度: 3
当前并发度: 3
并发请求已经全部发起
当前并发度: 3
并发请求已经全部发起
当前并发度: 3
并发请求已经全部发起
请求已经全部结束

使用Promise.all实现限制并发请求函数相关推荐

  1. axios.all与Promise.all并发请求

    前言 在工作中当我们的项目来到一个新的页面需要发多个请求,而这些请求的数据又毫不相干时,我们可以采取并发请求的方式.目前并发请求主要有Promise.all和axios.all两种方式,下面做详细介绍 ...

  2. js callback promise async await 几种异步函数处理方式

    ***callback  这个是最常用的也是最简单的 ,比如在ajax网络请求中,返回请求完成返回的数据 回调函数就是把一个函数当成另一个函数的参数,可以传递函数内的局部变量,也可以异步完成一些操作, ...

  3. 解秘 Node.js 单线程实现高并发请求原理,以及串联同步执行并发请求的方案

    最近在做一个支持多进程请求的 Node 服务,要支持多并发请求,而且请求要按先后顺序串联同步执行返回结果. 对,这需求就是这么奇琶,业务场景也是那么奇琶. 需求是完成了,为了对 Node.js 高并发 ...

  4. 字节面试官:如何实现Ajax并发请求控制

    偷偷告诉你,点此抽奖送红包还送3本比红宝书还贵的书 实现一个批量请求函数 multiRequest(urls, maxNum),要求如下: • 要求最大并发数 maxNum • 每当有一个请求返回,就 ...

  5. ajax 高并发请求,理解node.js处理高并发请求原理

    很少分享技术文章,写的不好的地方请大家多多指教,本文是自己对于node.js的一些见解,如有纰漏请在评论区交流. 高并发策略 通常高并发的解决方案就是提供多线程模型,服务器为每个客户端请求分配一个线程 ...

  6. Vue3(撩课学院)笔记09-axios简介,发起get请求的两种方式,发起带参的get及post请求,发起并发请求,并发请求结果将数组展开,axios全局配置,axios配置及封装,请求和响应拦截

    1.axios简介 axios是基于promise可以用于浏览器和node.js的网络请求库,在服务器端使用原生node.js,在浏览气短使用ajax(即XMLHttpRequests) 2.axio ...

  7. python3 爬虫例子_如何让你写的爬虫速度像坐火箭一样快【并发请求】

    开坑个新系列,主要面向新手,老司机可以忽略. 这个系列内的文章将会让你知道如何做到让你写的爬虫在运行的时候速度能像火箭一样快! 很多初学爬虫的朋友对于这方面的知识似乎是空白的,甚至还有一些在爬虫岗位上 ...

  8. PostgreSQL数据库 OLTP高并发请求性能优化

    PostgreSQL数据库 OLTP高并发请求性能优化   2015-10-14 11:00:00|  作者:德哥:分类: PgSQL PerfTuning| 2015年度PG大象会报名地址: htt ...

  9. Vue项目—请求函数的封装

    Vue项目-请求函数的封装 import axios from 'axios'export const post = (url, data = {}) => {return new Promis ...

最新文章

  1. 14 类编程题解法总结
  2. 创建型模式--工厂方法模式
  3. WKWebView的使用与JS交互详细解读
  4. ajax在php中使用方法,在项目中如何使用ajax请求
  5. 失败全是无能,成功多是侥幸。
  6. msvcrt.dll故障模块 explorer.exe_辽阳专业的风冷热泵模块机组厂
  7. 输入法设置,SublimeTest,putty掉线
  8. SQL 2008 群集配置详尽攻略[3]—主节点备节点数据库安装
  9. PTA数据结构-01-复杂度1 最大子列和问题
  10. 微信怎样关闭QQ文件服务器,如何屏蔽QQ和微信的外发文件?
  11. linux单网卡多拨Adsl,ADSL多拨
  12. unity3d占用内存太大解决方法
  13. Android中如何计算图片占用的实际内存大小?
  14. 迟来的加勒比海盗3 观后
  15. 数据库高级(校招冲刺必备)
  16. 数据可视化工具有哪些
  17. fpga组合逻辑(4位比较器、8-3优先编码器、38译码器实现全减器、数据选择器实现逻辑函数等)
  18. 从零开始学习VIO笔记 --- 第四讲:滑动窗口(基于滑动窗口算法的 VIO 系统:可观性和一致性)
  19. 【转】计算机科学经典之作。。。
  20. 好口才是如何炼成的!

热门文章

  1. DNS 缓存、CDN 缓存、浏览器缓存,JVM DNS 缓存详解
  2. FFT(快速傅里叶变换)学习笔记
  3. 用“视觉”确保品质——IC芯片质量检测
  4. laravel项目使用appnode部署linux系统到阿里云服务器流程记录(待补充)
  5. vb sendmessage 详解
  6. 求5个整数的平均值用c语言,编写求一组整数的和与平均值的程序
  7. 【人民币识别】人民币序列号识别【含GUI Matlab源码 908期】
  8. 【调剂】欢迎调剂重庆理工大学计算机学院(2021年)
  9. 1.3 计算机网络的功能
  10. java点到直线的投影点到经纬度_计算点在平面上的投影坐标