不多废话了,直接上代码:
class ConcurrentRequestQueue {
constructor(concurrency) {
this.concurrency = concurrency; // 并发数量
this.queue = []; // 请求队列
this.activeCount = 0; // 当前正在执行的请求数量
}
// 添加请求到队列
addRequest(method, url, params) {
return new Promise((resolve, reject) => {
this.queue.push({ method, url, params, resolve, reject });
// 尝试处理队列
this.processQueue();
});
}
// 处理队列
async processQueue() {
// 如果当前活跃的请求小于并发限制,并且队列中有任务
while (this.activeCount < this.concurrency && this.queue.length > 0) {
const { method, url, params, resolve, reject } = this.queue.shift(); // 取出队列中的请求
this.activeCount++; // 增加活跃请求计数
try {
const result = await this.executeRequest(method, url, params); // 执行请求
resolve(result); // 请求成功,返回结果
} catch (error) {
reject(error); // 请求失败,返回错误
} finally {
this.activeCount--; // 请求完成,减少活跃计数
this.processQueue(); // 继续处理队列
}
}
}
// 执行请求
async executeRequest(method, url, params) {
// 模拟一个简单的请求函数
return new Promise((resolve, reject) => {
console.log(`Executing ${method} request to ${url} with params:`, params);
// 模拟异步请求
setTimeout(() => {
const response = `Response from ${url} with method ${method} and params: ${JSON.stringify(params)}`;
resolve(response);
}, Math.random() * 2000);
});
}
}
// 示例使用
const queue = new ConcurrentRequestQueue(3); // 设置并发数量为3
// 添加类型的不同请求
queue.addRequest("GET", "https://api.example.com/data", { id: 1 }).then((result) => {
console.log(result);
});
queue.addRequest("POST", "https://api.example.com/submit", { name: "John", age: 30 }).then((result) => {
console.log(result);
});
queue.addRequest("GET", "https://api.example.com/info", { query: "test" }).then((result) => {
console.log(result);
});
queue.addRequest("PUT", "https://api.example.com/update", { id: 2, value: "updated" }).then((result) => {
console.log(result);
});
代码说明:
-
ConcurrentRequestQueue
类:-
addRequest(method, url, params)
:允许用户指定请求方法(如GET
、POST
等)、请求URL和请求参数。 -
processQueue()
:从队列中取出请求并执行,同时控制并发数量。 -
executeRequest(method, url, params)
:执行具体的请求逻辑。这里使用了一个模拟的异步请求函数,可以根据实际需求替换为真实的HTTP请求(如使用fetch
或axios
)。
-
-
请求执行逻辑:
-
每个请求通过
executeRequest
方法执行,支持动态传入请求方法、URL和参数。 -
请求完成后,减少活跃计数,并继续处理队列。
-
-
示例使用:
-
创建一个并发队列实例,设置并发数量为3。
-
添加了不同类型的请求(
GET
、POST
、PUT
等),并传入不同的参数。 -
每个请求完成后,打印响应结果。
-
如何扩展为真实请求:
如果你需要将模拟请求替换为真实的HTTP请求,可以使用fetch
或axios
。以下是使用axios
的示例:
import axios from "axios";
class ConcurrentRequestQueue {
// ...(其他代码不变)
// 执行请求
async executeRequest(method, url, params) {
try {
const response = await axios({ method, url, params });
return response.data; // 返回响应数据
} catch (error) {
throw new Error(`Request failed: ${error.message}`);
}
}
}