Promise.all做并发限制

Promise.allLimitied = function(tasks = [], limit = 2) {
  let queue = tasks.slice(0, limit);
  let arr = [];
  let num = 0;
  return new Promise((resolve, reject) => {
    function processMap() {
      if (num === tasks.length) {
        return resolve(arr);
      }
    }
    function singlePromise(item, index) {
      Promise.resolve(item).then(data => {
        arr[index] = data;
        num++;
        processMap();
        // 这种是真正的queue中的promise完成一个就会新触发一个tasks队列中的promise,之前那种实际是等到queue中所有的promise都完成了才一个一个触发,效率并不高
        if (num < tasks.length && tasks[limit + num - 1]) {
          singlePromise(tasks[limit + num - 1], limit + num - 1);
        }
        // 之前的方式
        // if (num >= limit && tasks.length > num) {
        //   singlePromise(tasks[num], num);
        // }
      }, reject);
    }
    queue.forEach((item, index) => {
      singlePromise(item, index);
    });
  });
};
function setPromise(num) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(num);
    }, num * 10);
  });
}
let p1 = setPromise(100);
let p2 = setPromise(200);
let p3 = setPromise(300);
let p4 = setPromise(400);
let p5 = setPromise(500);
let p6 = setPromise(600);
let p7 = setPromise(700);
let p8 = setPromise(800);
let p9 = setPromise(900);
let p10 = setPromise(1000);

console.time("time");
Promise.allLimitied([p10, p2, p3, p4, p5, p6, p7, p8, p9, p1], 5).then(data => {
  console.log(data);
  console.timeEnd("time");
});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值