实现一个批量请求函数 multiRequest(urls, maxNum),要求如下: • 要求最大并发数 maxNum • 每当有一个请求返回,就留下一个空位,可以增加新的请求 • 所有请求完成后,结果按照 urls 里面的顺序依次打出
上面的代码不够好,看下面这个版本的
// 解答:使用递归和队列----------------------------------------------
// 模拟异步请求函数
function request(index) {
console.log(`请求 ${index} 开始`);
return new Promise((resolve) => {
// 模拟请求耗时
const time = Math.random() * 2000 + 1000;
setTimeout(() => {
console.log(`请求 ${index} 完成`);
resolve(index);
}, time);
});
}
// 处理请求队列
async function processRequests(requests) {
const results = [];
let index = 0;
async function sendNext() {
if (index >= requests.length) return;
const currentIndex = index++;
const result = await requests[currentIndex]();
results[currentIndex] = result;
// 递归调用发送下一个请求
await sendNext();
}
// 同时启动三个请求
const initialPromises = Array.from({ length: Math.min(3, requests.length) }, sendNext);
await Promise.all(initialPromises);
return results;
}
// 创建请求数组
const requests = Array.from({ length: 10 }, (_, i) => () => request(i));
// 处理请求
processRequests(requests).then((results) => {
console.log('所有请求完成,结果按顺序排列:', results);
});
// 请求 0 开始
// 请求 1 开始
// 请求 2 开始
// 请求 1 完成
// 请求 3 开始
// 请求 0 完成
// 请求 4 开始
// 请求 3 完成
// 请求 5 开始
// 请求 2 完成
// 请求 6 开始
// 请求 4 完成
// 请求 7 开始
// 请求 6 完成
// 请求 8 开始
// 请求 5 完成
// 请求 9 开始
// 请求 7 完成
// 请求 8 完成
// 请求 9 完成
// 所有请求完成,结果按顺序排列: [
// 0, 1, 2, 3, 4,
// 5, 6, 7, 8, 9
// ]
完结撒花~~