/**
* 异步发送单个请求
* @param {string} url 请求的URL地址
* @returns {Promise} 返回一个Promise对象,该Promise对象将在请求完成时被resolve,并将请求结果作为参数
*/
async function sendRequest(url) {
// 发送请求并获取响应
const response = await fetch(url);
// 将响应转换为JSON格式的数据
const data = await response.json();
// 返回请求结果
return data;
}
/**
* 控制并发请求数量
* @param {string[]} urls 请求的URL列表
* @param {number} limit 并发请求数量的限制值
* @returns {Promise} 返回一个Promise对象,该Promise对象将在所有请求完成时被resolve,并将所有请求结果作为参数
*/
async function requestPool(urls, limit) {
// 复制请求列表
const requestQueue = urls.slice();
// 正在运行的请求列表
const runningQueue = [];
// 当请求队列和运行队列都为空时,结束循环
while (requestQueue.length > 0 || runningQueue.length > 0) {
// 当运行队列未达到限制值并且请求队列中有请求时,从请求队列中取出一个请求并发送
while (runningQueue.length < limit && requestQueue.length > 0) {
// 从请求队列中取出一个请求的URL
const url = requestQueue.shift();
// 发送请求并返回Promise对象
const request = sendRequest(url);
// 将Promise对象添加到正在运行的请求列表中
runningQueue.push(request);
}
// 等待最先完成的请求
const finishedRequest = await Promise.race(runningQueue);
// 从正在运行的请求列表中移除已完成的请求
runningQueue.splice(runningQueue.indexOf(finishedRequest), 1);
// 如果请求队列中还有请求,立即发送下一个请求
if (requestQueue.length > 0) {
// 从请求队列中取出下一个请求的URL
const url = requestQueue.shift();
// 发送请求并返回Promise对象
const request = sendRequest(url);
// 将Promise对象添加到正在运行的请求列表中
runningQueue.push(request);
}
}
// 使用Promise.all等待所有请求完成,并返回请求结果数组
const results = await Promise.all(runningQueue);
return results;
}
前端控制请求接口的并发量
于 2023-04-24 15:43:23 首次发布