Promise.all 并发限制

参考链接

简介

Promise.all 可以保证,promises 数组中所有 promise 对象都达到 resolve 状态,才执行 then 回调。
这时候考虑一个场景:如果你的 promises 数组中每个对象都是 http 请求,或者说每个对象包含了复杂的调用处理。而这样的对象有几十万个。
那么会出现的情况是,你在瞬间发出几十万 http 请求(tcp 连接数不足可能造成等待),或者堆积了无数调用栈导致内存溢出。
这时候,我们就需要考虑对 Promise.all 做并发限制。
Promise.all 并发限制指的是,每个时刻并发执行的 promise 数量是固定的,最终的执行结果还是保持与原来的 Promise.all 一致。

现在已经有的成熟解决方案:tiny-async-pooles6-promise-poolp-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 并发限制相关推荐

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

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

  2. Promise请求并发

    1.请求并发 代码如下(示例): const results = await Promise.all([getOrderSumByDates(params),getContrastByDates(pa ...

  3. 控制Promise的并发

    在做RN拆包时,想同时创建多个node进程来打包,但又不可同时创建太多进程,所以做了这么一个Promise队列,来模拟并发 const limit = 2; const data = ['https: ...

  4. 解决微信小程序 wx.request 方法不支持 Promise 并发数问题

    wx-promise-request 是微信小程序 wx.request 方法的不支持 Promise 和并发数问题的解决方案.如果只需要解决并发数问题,可以使用wx-queue-request.js ...

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

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

  6. 使用 Promise 时的5个常见错误

    作者:Ravidu Perera 译者:前端小智 来源:medium 有梦想,有干货,微信搜索 [大迁世界] 关注这个在凌晨还在刷碗的刷碗智. 本文 GitHub https://github.com ...

  7. promise 、async/await 的原理及实现

    前言 事件循环机制 由于 javascript 引擎是采用单线程运行机制,执行耗时过大的操作时会造成页面的阻塞,为了解决页面的阻塞问题,js 将任务分为 同步任务.异步任务,随之而来的是异步带来的执行 ...

  8. 【Java扫盲篇】今天用人话给你讲清楚:进程、线程、并发、并行、高并发?

    在这里你可以了解: 为啥大家说的进程的意思有出入? 为啥并发那么难理解? 为啥高并发不仅仅是 "高"+"并发" 的意思? 为啥这些概念到了现实当中就不一样了? ...

  9. 如何理解:程序、进程、线程、并发、并行、高并发?

    在这里你可以了解: 为啥大家说的进程的意思有出入? 为啥并发那么难理解? 为啥高并发不仅仅是"高"+"并发"的意思? 为啥这些概念到了现实当中就不一样了? 进程 ...

最新文章

  1. Lucene.Net---1索引的建立
  2. Linux下的查找命令
  3. java 数据截断_java – 数据截断:第1行的列’标志’的数据太长
  4. 2019 中国.NET 开发者峰会正式启动
  5. session和cookie的最深刻理解
  6. 【ES】ES 7.6报错 SearchPhaseExecutionException: all shards failed OutOfMemoryError
  7. 百度语音识别技术突破 巨头崛起
  8. url 收录工具_为什么我的网站不收录??
  9. ATOM使用的一点心得与技巧——在一个窗口打开多个项目
  10. jQuery入门教程
  11. 使用swift集成移动广告聚合平台
  12. matlab difittool,matlab工具箱下载安装和使用方法的汇总|Toolbox 大全
  13. 内网穿透NPS使用教程
  14. 如何体面的解决浏览器首页被hao123绑架
  15. 4.(css3布局)使用flex布局携程网首页案例
  16. 设计模式:仲裁者(Mediator)模式
  17. CSS3配合JavaScript图片爆炸效果
  18. 仿鱼爪新媒账号过户转让平台源码/友价内核账号交易源码
  19. Error response from daemon: pull access denied for registey, repository does not exist or may requir
  20. A系统给B系统转100块钱如何实现?

热门文章

  1. HOME键窥探Android的Activity生命周期
  2. photoshop中新建画布偏黄问题
  3. html5三维空间效果,基于HTML5的空间环境数据三维成像研究与应用
  4. 《Alogrithms》算法学习笔记——第二章:分治
  5. 【SHOI2007/BZOJ1933】书柜的尺寸 dp
  6. 求安卓拓扑图实现思路
  7. Ubuntu截屏快捷键设置
  8. VVC中CIIP、OBMC和LMCS工具的协同
  9. java panel适应窗口_如何使JTabbedPane自动调整大小以适应页面尺寸?
  10. 怎样用计算机制作剪贴画,Office入门:什么是剪贴画、图像-电脑基础-电脑技巧收藏家...