有很多个 异步(ajax)请求如何保持同时只有3个并发
时间: 2023-11-28 16:47:11 浏览: 88
你可以使用 JavaScript 中的 Promise 和 async/await 语法结合 XMLHttpRequest 或 fetch API 来实现异步请求并控制并发数量。
具体实现步骤如下:
1. 定义一个变量 `concurrency` 表示你想要控制的并发请求数量,初始化为 3。
2. 定义一个数组 `queue`,用于存储待处理的请求。
3. 定义一个函数 `handleNextRequest`,该函数用于处理队列中下一个请求。该函数会从 `queue` 数组中取出一个请求,并发送它。
4. 当有新请求到达时,将其加入到 `queue` 数组中,并判断当前正在处理的请求数量是否已经达到 `concurrency`。如果没有达到,则调用 `handleNextRequest` 函数处理队列中的下一个请求。
5. 当某个请求完成后,调用 `handleNextRequest` 函数处理队列中的下一个请求。
下面是一个示例代码:
```javascript
const concurrency = 3;
let running = 0;
const queue = [];
function sendRequest(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.onload = () => resolve(xhr.responseText);
xhr.onerror = () => reject(xhr.statusText);
xhr.send();
});
}
async function handleNextRequest() {
if (queue.length === 0 || running >= concurrency) {
return;
}
running++;
const request = queue.shift();
try {
const response = await sendRequest(request.url);
request.resolve(response);
} catch (error) {
request.reject(error);
} finally {
running--;
handleNextRequest();
}
}
function addRequest(url) {
return new Promise((resolve, reject) => {
queue.push({ url, resolve, reject });
handleNextRequest();
});
}
```
使用时,你只需要调用 `addRequest` 函数来添加请求即可:
```javascript
addRequest('/api/data1').then(response => {
console.log(response);
}).catch(error => {
console.error(error);
});
addRequest('/api/data2').then(response => {
console.log(response);
}).catch(error => {
console.error(error);
});
// ...
```
这样,你就可以控制同时只有 3 个并发请求了。注意,这个示例代码只是一个简单的示例,实际情况下可能需要根据具体需求做一些调整。
阅读全文