【请求队列】js实现的并发请求队列控制,可以设置并发数量,每个请求可以设置传入的参数和请求方式。

不多废话了,直接上代码:

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);
});

代码说明:

  1. ConcurrentRequestQueue

    • addRequest(method, url, params):允许用户指定请求方法(如GETPOST等)、请求URL和请求参数。

    • processQueue():从队列中取出请求并执行,同时控制并发数量。

    • executeRequest(method, url, params):执行具体的请求逻辑。这里使用了一个模拟的异步请求函数,可以根据实际需求替换为真实的HTTP请求(如使用fetchaxios)。

  2. 请求执行逻辑

    • 每个请求通过executeRequest方法执行,支持动态传入请求方法、URL和参数。

    • 请求完成后,减少活跃计数,并继续处理队列。

  3. 示例使用

    • 创建一个并发队列实例,设置并发数量为3。

    • 添加了不同类型的请求(GETPOSTPUT等),并传入不同的参数。

    • 每个请求完成后,打印响应结果。

如何扩展为真实请求:

如果你需要将模拟请求替换为真实的HTTP请求,可以使用fetchaxios。以下是使用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}`);
    }
  }
}