实现方法有多种,这里参考一个async-pool的库,https://github.com/rxaviers/async-pool/blob/master/lib/es6.js 。代码很短很精华
//https://github.com/rxaviers/async-pool/blob/master/lib/es6.js async function asyncPool(limit, array, iteratorFn) { const ret = []; const executing = []; for (const item of array) { const p = iteratorFn(item); ret.push(p); if (limit <= array.length) { const e = p.then(() => { console.log('正在运行' + executing.length) executing.splice(executing.indexOf(e), 1) }); executing.push(e); if (executing.length >= limit) { await Promise.race(executing); } } } return Promise.all(ret); } const timeout = (i) => { console.log('开始' + i); return new Promise((resolve) => setTimeout(() => { resolve(i); console.log('结束' + i); }, 1000+Math.random()*1000)); }; let urls = Array(10).fill(0).map((v,i)=>i) console.log(urls); (async () => { const res = await asyncPool(3, urls, timeout); console.log(res); })()