问题描述:
如果 100 个请求,该怎么用 Promise 去控制并发?
思路:
将关键步骤拆分出合适的函数来组织代码
1、循环去启动能执行的任务
2、取出任务并且推到执行器执行
3、执行器内更新当前的并发数,并且触发捞起任务
4、捞起任务里面可以触发最终的回调函数和调起执行器继续执行任务
// 异步函数,发送多个请求
async function sendRequests(url, paramsList, concurrentLimit) {
const results = []; // 存储每个请求的结果
let currentIndex = 0; // 当前请求的索引
while (currentIndex < paramsList.length) { // 当仍有未处理的请求时
const concurrentRequests = []; // 存储当前批次的并发请求
for (let i = 0; i < concurrentLimit && currentIndex < paramsList.length; i++) {
// 对于每个请求,将参数取出并构建一个请求Promise
const params = paramsList[currentIndex];
const requestPromise = makeRequest(url, params);
concurrentRequests.push(requestPromise); // 将请求Promise添加到当前批次的并发请求列表中
currentIndex++; // 增加当前请求的索引
}
try {
const responses = await Promise.all(concurrentRequests); // 等待并发请求批次完成
console.log("请求成功:", responses);
results.push(...responses);
} catch (error) {
console.error("请求出错:", error);
}
}
return results; // 返回所有请求的结果数组
}
const url = 'https://api.example.com/endpoint'; // 替换为实际的请求接口
const paramsList = [{ data: '1' }, { data: '2' }, { data: '3' }]; // 请求参数列表
const concurrentLimit = 100; // 同时进行的请求数量
sendRequests(url, paramsList, concurrentLimit) // 发送请求
.then(results => {
console.log("所有请求完成"); // 所有请求完成时打印消息
console.log("结果数组:"); // 打印结果数组的标识
results.forEach((result, index) => {
console.log(index, result); // 打印每个结果的索引和值
});
})
.catch(error => {
console.error("请求出错", error); // 请求过程中出现错误时打印错误消息
});