前端控制请求接口的并发量

/**
 * 异步发送单个请求
 * @param {string} url 请求的URL地址
 * @returns {Promise} 返回一个Promise对象,该Promise对象将在请求完成时被resolve,并将请求结果作为参数
 */
async function sendRequest(url) {
  // 发送请求并获取响应
  const response = await fetch(url);
  // 将响应转换为JSON格式的数据
  const data = await response.json();
  // 返回请求结果
  return data;
}

/**
 * 控制并发请求数量
 * @param {string[]} urls 请求的URL列表
 * @param {number} limit 并发请求数量的限制值
 * @returns {Promise} 返回一个Promise对象,该Promise对象将在所有请求完成时被resolve,并将所有请求结果作为参数
 */
async function requestPool(urls, limit) {
  // 复制请求列表
  const requestQueue = urls.slice();
  // 正在运行的请求列表
  const runningQueue = [];

  // 当请求队列和运行队列都为空时,结束循环
  while (requestQueue.length > 0 || runningQueue.length > 0) {
    // 当运行队列未达到限制值并且请求队列中有请求时,从请求队列中取出一个请求并发送
    while (runningQueue.length < limit && requestQueue.length > 0) {
      // 从请求队列中取出一个请求的URL
      const url = requestQueue.shift();
      // 发送请求并返回Promise对象
      const request = sendRequest(url);
      // 将Promise对象添加到正在运行的请求列表中
      runningQueue.push(request);
    }

    // 等待最先完成的请求
    const finishedRequest = await Promise.race(runningQueue);
    // 从正在运行的请求列表中移除已完成的请求
    runningQueue.splice(runningQueue.indexOf(finishedRequest), 1);

    // 如果请求队列中还有请求,立即发送下一个请求
    if (requestQueue.length > 0) {
      // 从请求队列中取出下一个请求的URL
      const url = requestQueue.shift();
      // 发送请求并返回Promise对象
      const request = sendRequest(url);
      // 将Promise对象添加到正在运行的请求列表中
      runningQueue.push(request);
    }
  }

  // 使用Promise.all等待所有请求完成,并返回请求结果数组
  const results = await Promise.all(runningQueue);
  return results;
}

你可能感兴趣的:(前端,javascript,json)