问答题1155/1588实现一个批量请求函数,要求能够限制并发量

难度:
2023-05-15 创建

参考答案:

这道题比较有意思,其实就是要实现一个限制最大并发的 Promise.all()。

实现思路也比较简单,就是在每个请求结束后,看队列中是否有未完成的请求,如果有,就按顺序进行下一个请求。

1function multiRequest(urls = [], maxNum) { 2 // 请求总数量 3 const sum = urls.length; 4 // 根据请求数量创建一个数组来保存请求的结果 5 const result = new Array(sum).fill(false); 6 // 当前完成的数量 7 let count = 0; 8 9 return new Promise((resolve, reject) => { 10 // 请求maxNum个 11 while (count < maxNum) { 12 next(); 13 } 14 function next() { 15 let current = count++; 16 // 处理边界条件 17 if (current >= sum) { 18 // 请求全部完成就将promise置为成功状态, 然后将result作为promise值返回 19 !result.includes(false) && resolve(result); 20 return; 21 } 22 const url = urls[current]; 23 console.log(`开始 ${current}`, new Date().toLocaleString()); 24 fetch(url).then(res => { 25 // 保存请求结果 26 result[current] = res; 27 console.log(`完成 ${current}`, new Date().toLocaleString()); 28 // 请求没有全部完成, 就递归 29 if (current < sum) { 30 next(); 31 } 32 }).catch(err => { 33 console.log(`结束 ${current}`, new Date().toLocaleString()); 34 result[current] = err; 35 // 请求没有全部完成, 就递归 36 if (current < sum) { 37 next(); 38 } 39 }); 40 } 41 }); 42} 43 44const url = `https://www.baidu.com/s?wd=javascript`; 45const urls = new Array(100).fill(url); 46 47(async () => { 48 const res = await multiRequest(urls, 10); 49 console.log(res); 50})();

最近更新时间:2023-09-24

赞赏支持

预览

题库维护不易,您的支持就是我们最大的动力!