Promise实现并发控制

您所在的位置:网站首页 js并发请求限制个数怎么解决 Promise实现并发控制

Promise实现并发控制

2023-07-28 03:01| 来源: 网络整理| 查看: 265

面试题:实现一个输入url数组与并发数的并发数量控制请求队列函数。

觉得比较有意思,而且平常的开发中是有可能遇到相关业务场景的。于是动手写了一下。

const fn = url => { // 实际场景这里用axios等请求库 发请求即可 也不用设置延时 return new Promise(resolve => { setTimeout(() => { console.log('完成一个任务', url, new Date()); resolve({ url, date: new Date() }); }, 1000); }) }; function limitQueue(urls, limit) { // 完成任务数 let i = 0; // 填充满执行队列 for (let excuteCount = 0; excuteCount < limit; excuteCount++) { run(); } // 执行一个任务 function run() { // 构造待执行任务 当该任务完成后 如果还有待完成的任务 继续执行任务 new Promise((resolve, reject) => { const url = urls[i]; i++; resolve(fn(url)) }).then(() => { if (i < urls.length) run() }) } }; 复制代码

核心思路:控制并发数量,关键点就是利用promise,当一个请求完成后,去发起下一个请求。

coding思路:

由于要完成一个继续下一个,保证同时有limit个在同时执行。所以我们需要一个递归的执行函数run; 首先在函数执行时,需要将执行中的任务按顺序填满,数量为限制并发数 执行函数中,需要在执行完成后,判断是否有下一个待执行任务;于是我们声明变量i,用来计数,与最终需要执行的总数比较判断是否需要递归执行下一个任务

测试:

const urls = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]; (async _ => { await limitQueue(urls, 4); })() 复制代码

1.png



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3