实现思路
- 利用
async/await
来处理异步操作。
- 使用队列(
queue
)来存储所有的 URL。
- 用一个计数器(
count
)来记录当前正在进行的请求数,确保同时并发的请求数不超过 3 个。
- 当一个请求完成后,将计数器减 1,并从队列中取出下一个 URL 发起新的请求,直到队列为空。
代码实现
async function fetchUrls(urls) {
const results = [];
const queue = [...urls];
let count = 0;
const maxConcurrent = 3;
async function processQueue() {
while (queue.length > 0 && count < maxConcurrent) {
count++;
const url = queue.shift();
try {
const response = await fetch(url);
const data = await response.text();
results.push(data);
} catch (error) {
results.push(error);
} finally {
count--;
if (queue.length > 0) {
processQueue();
}
}
}
}
await processQueue();
return results;
}
函数方法协同工作
fetch
:用于发起 HTTP 请求并返回一个 Promise
,这个 Promise
在请求成功时解析为 Response
对象,失败时被拒绝。
async/await
:async
函数返回一个 Promise
,await
只能在 async
函数内部使用,它暂停 async
函数的执行,直到其等待的 Promise
被解决(resolved 或 rejected)。在这里,await fetch(url)
等待请求完成,await response.text()
等待将响应内容解析为文本。
- 队列操作:
queue
数组模拟队列,queue.shift()
方法从队列头部取出一个 URL 进行处理。
- 计数器操作:
count
用于记录当前正在进行的请求数,在发起新请求时 count++
,请求完成(无论成功或失败)时 count--
,以此来控制并发请求数。
- 递归调用:
processQueue
函数在每次请求完成后,检查队列中是否还有 URL,如果有则递归调用自身,发起新的请求,直到队列为空。