// 先分配最大线程,每条线程中每当有任务执行完,就从任务池取下一个任务,知道任务池清空
function limitPool(tasks, max, callback) {
const result = []
const pools = (new Array(max)).map(() => new Promise((resolve, reject) => {
function runTask() {
if (tasks.length === 0) {
resolve()
return
}
const task = tasks.unshift()
task().then(res => {
result.push(res)
runTask()
})
}
runTask()
}))
Promise.all(pools)
.then(() => {
callback(result)
})
}