js手写并发请求控制

文章介绍了如何使用Promise和微任务机制创建一个limit函数,该函数限制并发执行的任务数,确保任务按照给定的count参数以最大并发数执行。通过`Promise.resolve().then`将任务添加到微任务队列,并在任务完成后从doingTasks中移除。
摘要由CSDN通过智能技术生成

关键点

    1. new promise 一经创建,立即执行
    1. 使用 Promise.resolve().then 可以把任务加到微任务队列,防止立即执行迭代方法
    1. 微任务处理过程中,产生的新的执行微任务,会在同一事件循环内,追加到微任务队列里
    1. 使用 race 在某个任务完成时,继续添加任务,保持任务按照最大并发数进行
    1. 任务完成后,需要从 doingTasks 中移出
function limit (count, array, iterateFunc) {
    const tasks = [];
    const doingTasks = [];
    let i = 0;
    const enqueue = () => {
        if (i === array.length) {
            return Promise.resolve();
        }
        const task = Promise.resolve().then(() => iterateFunc(array[i++]));
        tasks.push(task);
        const doing = task.then(() => doingTasks.splice(doingTasks.indexOf(task), 1));
        doingTasks.push(doing);
        const res = doingTasks.length >= count ? Promise.race(doingTasks) : Promise.resolve();
        return res.then(enqueue);
    };
    return enqueue().then(() => Promise.all(tasks));
}

测试

const timeout = i => new Promise(resolve => setTimeout(() => {
    resolve(i);
}, i));

limit(3, [1000, 2000, 3000, 4000, 5000, 6000], timeout).then((res) => {
  console.log("最后的所有结果汇总--res---", res);
});

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值