请实现如下的函数,可以批量请求数据,所有的URL地址在urls参数中,同时可以通过max参数控制请求的并发度,当所有请求结束之后,需要执行callback回调函数,发请求的函数可以直接使用fetch即可。function sendRequest(urls:string[],max: number, callback: ()=> void){}
function sendRequest(urls, max, callback) {
let count = urls.length; // 记录还未完成请求的数量
let index = 0; // 记录当前请求的索引
let results = []; // 记录所有请求的结果
function handleRequest() {
if (index >= urls.length) {
// 所有请求都已完成
callback(results);
return;
}
const url = urls[index];
index++;
fetch(url)
.then(response => response.json())
.then(data => {
results.push(data);
count--;
if (count === 0) {
// 当前并发请求数量已达到最大值,等待其中一个请求完成后再继续发起新的请求
handleRequest();
}
})
.catch(error => {
console.error(`请求 ${url} 失败:${error}`);
count--;
if (count === 0) {
// 当前并发请求数量已达到最大值,等待其中一个请求完成后再继续发起新的请求
handleRequest();
}
});
}
// 先发起 max 个请求
for (let i = 0; i < max; i++) {
handleRequest();
}
}
注:
这个函数接收三个参数:
urls
:一个包含所有请求地址的字符串数组。max
:最大并发请求数量。callback
:所有请求完成后的回调函数,它接收一个参数results
,是一个包含所有请求结果的数组。
函数的实现思路是:
- 先定义三个变量:
count
记录还未完成请求的数量,index
记录当前请求的索引,results
记录所有请求的结果。 - 定义一个
handleRequest
函数,用于发起单个请求。如果当前并发请求数量已达到最大值,就等待其中一个请求完成后再继续发起新的请求。 - 先发起
max
个请求,然后等待它们完成。每当一个请求完成时,就将其结果存入results
数组中,并将count
减一。如果此时还有未完成的请求,就继续发起新的请求。 - 当所有请求都已完成时,调用回调函数
callback
,并将results
数组作为参数传入。