限制數量請求池函數實現

// 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();
    });
  }
}
相關文章
相關標籤/搜索