实现思路:
可以使用 Promise 和异步函数。手动实现一个同步队列
测试数据
js
const tasks = new Array(88).fill(0).map((_, i) => () => {
return new Promise((resolve) => {
setTimeout(() => {
resolve(i)
}, Math.random() * 1000)
})
})
核心代码
js
function limitRequest(tasks, limit) {
const queue = []
let runingCount = 0
function enqueque(task) {
return new Promise((resolve, reject) => {
queue.push({
task,
resolve,
reject,
})
run()
})
}
function run() {
while (queue.length > 0 && runingCount < limit) {
runingCount++
const { task, resolve, reject } = queue.shift()
task()
.then((value) => {resolve(value);console.log(value)})
.catch((err) => reject(err))
.finally(() => {
runingCount--
run()
})
}
}
return Promise.all(tasks.map((task) => enqueque(task)))
}
测试代码
js
console.log(await limitRequest(tasks, 10))