如果要发100 个请求,怎么用 Promise 去控制并发

前端需要发送100 个请求,怎么控制并发

首先执行能执行的并发任务,每个任务执行完毕后,执行下一个要执行的任务

思路如下:

  1. 循环去启动规定数量的任务
  2. 取出任务并执行,并更新当前的并发数,当前执行完成后执行下一个任务。
  3. 执行下一个任务的函数中判断是否还有任务,有就继续执行任务,没有任务并且当前执行的并发数为0则触发最终的回调函数。

代码如下

  1. 模拟请求队列

// 模拟请求 
function request(url, time = 1) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('请求结束:' + url);
      if (Math.random() > 0.5) {
        resolve('成功')
      } else {
        reject('错误;')
      }
    }, time * 1e3)
  })
}

// 所有请求队列
const sendArr = [1, 2, 3, 4, 5, 6, 7, 8, 9].map((val, i) => {
  return () => request(val);
});

  1. 执行函数

const sendRequest = (list, limit, callback) => {

  // list 浅拷贝
  let promiseAll = list.slice();
  // 当前规定同时执行的数量
  let curNum = Math.min(list.length, limit);
  // 当前还在执行的数量
  let curCount = 0;

  // 开始执行函数
  const startRun = () => {
    let i = 0;

    while (i < curNum) {
      i++
      runTask();
    }
  }
  // 执行promise
  const runTask = () => {
    let task = promiseAll.shift();
    if (!task) return;
    curCount++;
    task().then(res => {})
      .catch(err => {})
      .finally(() => {
        curCount--;
        // 开始下一个
        runNext();
      })
  }
  // 执行剩下的promise
  const runNext = () => {
    if (promiseAll.length > 0 && curCount < curNum) {
      runTask();
    } else {
      // 队列为空,当前请求数为空 执行回调
      if (promiseAll.length == 0 && curCount === 0) {
        typeof callback === 'function' && callback();
      }

    }
  }
  // 开始
  startRun();
}

sendRequest(sendArr, 5, () => {
  console.log('所有请求结束')
})

// 执行结果
/**
 * 请求结束:1
    请求结束:2
    请求结束:3
    请求结束:4
    请求结束:5
    请求结束:6
    请求结束:7
    请求结束:8
    请求结束:9
    所有请求结束
 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值