function asyncPool(limit, array, iteratorFn) { let executing = [] // 正在执行的 let res = [] // 所有结果 let index = 0 // 当前索引 let len = array.length // 整体长度 function enqueue () { //队列函数 if (index === len) return Promise.resolve() let item = array[index++] let e = Promise.resolve().then(() => iteratorFn(item)) res.push(e) let p = e.then(() => { executing.splice(executing.indexOf(e), 1) }) executing.push(p) let r = Promise.resolve() if (executing.length >= limit) { r = Promise.race(executing) } return r.then(() => enqueue()) } return enqueue().then(() => Promise.all(res)) // 触发队列执行,并且确保队列执行完之后监控all res}const timeout = i => new Promise(resolve => setTimeout(() => { return resolve(i)}, i));asyncPool(2, [1000, 5000, 3000, 2000], timeout).then(results => { console.log(results)});