concurrent-request

# concurrent-request

// 并发请求,控制请求并发数
// taskQueues 一个个请求任务组成的数组
// concurrentNum 请求的并发数
module.exports = function concurrentRequest(taskQueues = [], concurrentNum = 1) {
 return new Promise(resolve => {
  // 存放所有任务的执行结果
  const taskRet = []

  // 开始先发送指定数量的并发请求
  while (concurrentNum > 0) {
   req()
   concurrentNum--
  }

  // 当每个请求完成后再递归的调用自身,发送任务队列的下一个请求
  function req() {
   // 递归终止条件(任务队列为空)
   if (!taskQueues.length) return Promise.allSettled(taskRet).then(res => {
    resolve(res)
   })

   // 从任务队列中弹出一个任务
   const task = taskQueues.shift()
   // 执行任务
   const ret = task()
   // 当任务完成后递归调用 req, 发送队列中的下一个请求
   res.then(() => {
    req()
   })
   // 并将任务结果 push 进结果数组中
   taskRet.push(ret)
  }
 })
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
上次更新: 2022/7/25 下午12:50:39