原文地址: https://juejin.cn/post/7163522138698153997
// 併發請求函數 const concurrencyRequest = (urls, maxNum) => { return new Promise((resolve) => { if (urls.length === 0) { resolve([]); return; } const results = []; let index = 0; // 下一個請求的下標 let count = 0; // 當前請求完成的數量 // 發送請求 async function request() { if (index === urls.length) return; const i = index; // 保存序號,使result和urls相對應 const url = urls[index]; index++; console.log(url); try { const resp = await fetch(url); // resp 加入到results results[i] = resp; } catch (err) { // err 加入到results results[i] = err; } finally { count++; // 判斷是否所有的請求都已完成 if (count === urls.length) { console.log('完成了'); resolve(results); } request(); } } // maxNum和urls.length取最小進行調用 const times = Math.min(maxNum, urls.length); for(let i = 0; i < times; i++) { request(); } }) }
測試 const urls = []; for (let i = 1; i <= 20; i++) { urls.push(`https://jsonplaceholder.typicode.com/todos/${i}`); } concurrencyRequest(urls, 3).then(res => { console.log(res); })