限制数量请求池函数实现

// function createRequestPool(poolSize) {
// }

// const request = createRequestPool(3);
// for (let i = 0; i < 10000; i++) {
//   request('/count').then(xxxx).catch(xxx)
// }

/**
 * 记笔记,待验证
 */
function createRequestPool(poolSize) {
  const reqs = [];
  const temps = [];

  return function (url) {

    function runTask() {

      // 循环添加到临时数组中
      while (reqs.length && temps.length < poolSize) {
        temps.push(reqs.shift());
      }

      // 遍历临时数组,发起请求
      for (let i = 0; i < temps.length; i++) {
        fetch(temps[i].url)
          .then((data) => {
            // 移除当前请求,并返回结果
            temps.splice(temps.indexOf(temps[i]), 1);
            temps[i].resolve(data);

            // 每完成一个,就须要执行队列中的任务
            runTask();
          })
          .catch((err) => {
            // 移除当前请求,并返回结果
            temps.splice(temps.indexOf(temps[i]), 1);
            temps[i].reject(err);
          });
      }
    }

    return new Promise((resolve, reject) => {
      reqs.push({
        url,
        resolve,
        reject
      });

      runTask();
    });
  }
}