使用promise.all限制并发请求个数

前不久做了字节青训营的笔试,其中第二道编程题便是利用promise.all()实现对并发请求个数的限制。

场景需求大概就是假设目前有邮件20封,每次只能发5封,五封邮件发出的时间有长有短,如果有一封右键发送完成后,就从剩下的15封邮件内再拿出一封放入请求队列中。

也就是直到所有邮件发送完成前,promise.all()函数中一直有5封邮件。

现使用定时器模拟发送请求的函数

 function asyncFetch(param) {
        return new Promise((resolve) => {
            setTimeout(() => {
                resolve(param)
            }, 2000)
        })
    }


 function limitRequest(requests, limit) {
        const pool = []  //正处于请求中的函数
        let index = 0    //待请求函数数组的索引
        const requestQueue = Math.min(requests.length, limit) //判断请求队列和个数的大小

        for (let key = 0; key < requestQueue; key++) {
            pool.push(run(requests[index++]))
        }
        function awaitRequest() {
            if (index == requests.length - 1) {
                console.log("所有请求已进入promise.all");
                return Promise.resolve()
            }
            return run(requests[index++])
        }

        function run(request) {
            return asyncFetch(request).then(awaitRequest)  //每完成一个请求,就执行resolve回调,从而向请求队列中添加新的请求
        }

        Promise.all(pool).then(() => {
            console.log("请求已全部完成");
        })
    }



 const paramArr=[1,2,3,4,5,6,7,8,9]

 limitRequest(paramArr, 3);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值