思路
- 同时发送的最大请求数MAX
- 请求结束后,立即发起下一个请求
- 请求结果顺序保存
方案一
通过for循环创建max个请求,请求结束后发起新的请求(递归)。直到请求数组为空。最终用promise.all保证所有的请求都结束
async function executeUrls(urls, max, callback) {
const results = [];
let running = 0;
async function execute(url) {
const result = await fetch(url); // 假设这里使用 fetch 函数获取数据
results.push(result); // 结果push,通过index对应result和请求
running--; // 正在执行的数量减1
if (urls.length > 0) { // 如果当前的url还没有执行完
execute(urls.shift()); // 继续执行
running++; // 执行数量+1
} else if (running === 0) { // 所有的url已经执行结束
callback(results); // 执行回掉
}
}
const promises = [];
for (let i = 0; i < max; i++) {
if (urls.length > 0) {
const url = urls.shift(); // 出队
promises.push(execute(url)); // promise队列入队一个promise请求
running++; // 正在执行的数量++
}
}
await Promise.allSettled(promises);
}
Promise实现
for循环遍历请求数组,push请求到promiseList,每个请求结束后再开始一个新的请求,达到最大值使用promise.race await 住。