如果你有100个请求需要发送,并且希望同时最多发送一定数量的请求,你可以使用 Promise 和 async/await 来控制并发。以下是一个可能的实现:
const urls = [/* 100个url */];
const maxConcurrency = 5; // 最多同时发送的请求数量
async function fetchData(url) {
// 发送请求的异步函数
const response = await fetch(url);
return response.json();
}
async function fetchAll() {
// 使用一个数组来存储所有请求的Promise
const promises = [];
let running = 0; // 当前正在运行的请求数量
// 遍历所有url
for (const url of urls) {
// 如果当前请求数量已经达到了最大并发量,等待其中一个请求完成
while (running >= maxConcurrency) {
await Promise.race(promises);
running--;
}
// 发送请求,并将Promise添加到数组中
const promise = fetchData(url);
promises.push(promise);
running++;
}
// 等待所有Promise完成
return Promise.all(promises);
}
fetchAll()
.then(results => {
// 所有请求完成后的处理
})
.catch(error => {
// 错误处理
});
在上述代码中,我们首先定义了一个包含100个URL的数组,并且定义了最多同时发送5个请求的变量。然后我们定义了一个async函数`fetchData`,用于发送单个请求并返回响应的JSON数据。接下来,我们定义了另一个async函数`fetchAll`,它使用一个数组来存储所有请求的Promise。
在`fetchAll`函数中,我们使用一个for循环遍历所有URL,同时使用一个while循环来等待并发请求数量少于最大并发数。在while循环中,我们使用`Promise.race`函数来等待其中一个Promise完成,并从数组中删除它,以便我们可以继续发送其他请求。
在for循环中,我们发送请求并将其Promise添加到数组中。最后,我们使用`Promise.all`函数等待所有Promise完成,并在完成后对结果进行处理。
请注意,在此示例中,我们使用了ES6中的`async/await`语法,它需要在支持该语法的JavaScript环境中运行。