假如有几十个请求,如何去控制并发?

场景举例:图片或文件批量下载(重点是并发,同时调接口)

实现:利用Promise模拟任务队列,从而实现请求池效果。

大致原理:先进先出,在第一个已进入任务完成后,第(队列数量限制数量+1) 个任务才会进入请求池,push一个的同时就会有一个被shift

废话不多说源码如下

import axios from 'axios'

export const handQueue = (
  reqs // 请求总数
) => {
  reqs = reqs || []


  const requestQueue = (concurrency) => {
    concurrency = concurrency || 6 // 最大并发数
    const queue = [] // 请求池
    let current = 0

    const dequeue = () => {//递归函数,当前并发级别执行请求
        //它检查当前计数是否小于最大并发级别(concurrency),
        //以及是否还有待处理的请求在 queue 数组中。
        //如果两个条件都满足,则增加 current 计数
        //从 queue 数组中取出一个请求 promise 工厂,使用 .then() 和 .catch() 执行它
        //并在最后减少 current 计数,并递归调用自身以处理下一个请求。
      while (current < concurrency && queue.length) {
        current++;
        const requestPromiseFactory = queue.shift() // 出列
        requestPromiseFactory()
          .then(() => { // 成功的请求逻辑
          })
          .catch(error => { // 失败
            console.log(error)
          })
          .finally(() => {
            current--
            dequeue()
          });
      }

    }

    return (requestPromiseFactory) => {
      queue.push(requestPromiseFactory) // 入队
      dequeue()
    }

  }

  const enqueue = requestQueue(6)//将请求添加到请求队列中,并控制并发请求数量为最多 6 个。

  for (let i = 0; i < reqs.length; i++) {
    //for 循环遍历 reqs 数组中的每个元素,使用索引 i 进行迭代。
    enqueue(() => axios.get('/api/test' + i))
  }
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值