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