Promise.all 并发限制
Promise.all 并发限制
参考链接
简介
Promise.all 可以保证,promises 数组中所有 promise 对象都达到 resolve 状态,才执行 then 回调。
这时候考虑一个场景:如果你的 promises 数组中每个对象都是 http 请求,或者说每个对象包含了复杂的调用处理。而这样的对象有几十万个。
那么会出现的情况是,你在瞬间发出几十万 http 请求(tcp 连接数不足可能造成等待),或者堆积了无数调用栈导致内存溢出。
这时候,我们就需要考虑对 Promise.all 做并发限制。
Promise.all 并发限制指的是,每个时刻并发执行的 promise 数量是固定的,最终的执行结果还是保持与原来的 Promise.all 一致。
现在已经有的成熟解决方案:tiny-async-pool
、es6-promise-pool
、p-limit
实现思路
主要是通过第三方插件,来控制异步函数的执行。
代码参考:tiny-async-pool
源码。相比于其主功能函数做了以下优化:
1、使用方式更接近原本的 Promise.all
。
function promsie1() {}
function promsie2() {}
function promsie3() {}Promise.all([promsie1(), promsie2(), promsie3()]);
PromiseLimit([promsie1, promsie2, promsie3]);
2、当执行过程中某个 promise 返回 reject 则停止后续的 promise 执行。
代码
function PromiseLimit(funcArray, limit = 5) {let i = 0;const result = [];const executing = [];const queue = function() {if (i === funcArray.length) return Promise.all(executing);const p = funcArray[i++]();result.push(p);const e = p.then(() => executing.splice(executing.indexOf(e), 1));executing.push(e);if (executing.length >= limit) {return Promise.race(executing).then(() => queue(),e => Promise.reject(e));}return Promise.resolve().then(() => queue());};return queue().then(() => Promise.all(result));
}
效果演示
// 测试代码
const result = [];
for (let index = 0; index < 10; index++) {result.push(function() {return new Promise((resolve, reject) => {console.log("开始" + index, new Date().toLocaleString());setTimeout(() => {resolve(index);console.log("结束" + index, new Date().toLocaleString());}, parseInt(Math.random() * 10000));});});
}PromiseLimit(result).then(data => {console.log(data);
});
// 修改测试代码 随机失败或者成功
const result = [];
for (let index = 0; index < 10; index++) {result.push(function() {return new Promise((resolve, reject) => {console.log("开始" + index, new Date().toLocaleString());setTimeout(() => {if (Math.random() > 0.5) {resolve(index);} else {reject(index);}console.log("结束" + index, new Date().toLocaleString());}, parseInt(Math.random() * 1000));});});
}
PromiseLimit(result).then(data => {console.log("成功", data);},data => {console.log("失败", data);}
);
Promise.all 并发限制相关推荐
- axios.all与Promise.all并发请求
前言 在工作中当我们的项目来到一个新的页面需要发多个请求,而这些请求的数据又毫不相干时,我们可以采取并发请求的方式.目前并发请求主要有Promise.all和axios.all两种方式,下面做详细介绍 ...
- Promise请求并发
1.请求并发 代码如下(示例): const results = await Promise.all([getOrderSumByDates(params),getContrastByDates(pa ...
- 控制Promise的并发
在做RN拆包时,想同时创建多个node进程来打包,但又不可同时创建太多进程,所以做了这么一个Promise队列,来模拟并发 const limit = 2; const data = ['https: ...
- 解决微信小程序 wx.request 方法不支持 Promise 并发数问题
wx-promise-request 是微信小程序 wx.request 方法的不支持 Promise 和并发数问题的解决方案.如果只需要解决并发数问题,可以使用wx-queue-request.js ...
- 字节面试官:如何实现Ajax并发请求控制
偷偷告诉你,点此抽奖送红包还送3本比红宝书还贵的书 实现一个批量请求函数 multiRequest(urls, maxNum),要求如下: • 要求最大并发数 maxNum • 每当有一个请求返回,就 ...
- 使用 Promise 时的5个常见错误
作者:Ravidu Perera 译者:前端小智 来源:medium 有梦想,有干货,微信搜索 [大迁世界] 关注这个在凌晨还在刷碗的刷碗智. 本文 GitHub https://github.com ...
- promise 、async/await 的原理及实现
前言 事件循环机制 由于 javascript 引擎是采用单线程运行机制,执行耗时过大的操作时会造成页面的阻塞,为了解决页面的阻塞问题,js 将任务分为 同步任务.异步任务,随之而来的是异步带来的执行 ...
- 【Java扫盲篇】今天用人话给你讲清楚:进程、线程、并发、并行、高并发?
在这里你可以了解: 为啥大家说的进程的意思有出入? 为啥并发那么难理解? 为啥高并发不仅仅是 "高"+"并发" 的意思? 为啥这些概念到了现实当中就不一样了? ...
- 如何理解:程序、进程、线程、并发、并行、高并发?
在这里你可以了解: 为啥大家说的进程的意思有出入? 为啥并发那么难理解? 为啥高并发不仅仅是"高"+"并发"的意思? 为啥这些概念到了现实当中就不一样了? 进程 ...
最新文章
- Lucene.Net---1索引的建立
- Linux下的查找命令
- java 数据截断_java – 数据截断:第1行的列’标志’的数据太长
- 2019 中国.NET 开发者峰会正式启动
- session和cookie的最深刻理解
- 【ES】ES 7.6报错 SearchPhaseExecutionException: all shards failed OutOfMemoryError
- 百度语音识别技术突破 巨头崛起
- url 收录工具_为什么我的网站不收录??
- ATOM使用的一点心得与技巧——在一个窗口打开多个项目
- jQuery入门教程
- 使用swift集成移动广告聚合平台
- matlab difittool,matlab工具箱下载安装和使用方法的汇总|Toolbox 大全
- 内网穿透NPS使用教程
- 如何体面的解决浏览器首页被hao123绑架
- 4.(css3布局)使用flex布局携程网首页案例
- 设计模式:仲裁者(Mediator)模式
- CSS3配合JavaScript图片爆炸效果
- 仿鱼爪新媒账号过户转让平台源码/友价内核账号交易源码
- Error response from daemon: pull access denied for registey, repository does not exist or may requir
- A系统给B系统转100块钱如何实现?
热门文章
- HOME键窥探Android的Activity生命周期
- photoshop中新建画布偏黄问题
- html5三维空间效果,基于HTML5的空间环境数据三维成像研究与应用
- 《Alogrithms》算法学习笔记——第二章:分治
- 【SHOI2007/BZOJ1933】书柜的尺寸 dp
- 求安卓拓扑图实现思路
- Ubuntu截屏快捷键设置
- VVC中CIIP、OBMC和LMCS工具的协同
- java panel适应窗口_如何使JTabbedPane自动调整大小以适应页面尺寸?
- 怎样用计算机制作剪贴画,Office入门:什么是剪贴画、图像-电脑基础-电脑技巧收藏家...