看到一道关于 JS 并发请求控制的题,大概的要求如下
要求:
- 并发请求
- 并发数有控制
- 并发请求每成功一个,就从队列中补一个,满足最大并发数 limit
- 所有请求结束后返回值按照顺序返回
方便的麻烦详细解答下。
另外看到一个解题思路,不清楚这样实现是否正确
function multiRequest(reqArr, limit) {
const len = reqArr.length
const res = new Array(len).fill(false)
let count = 0
return new Promise((resolve, reject) => {
while (count < limit) next()
async function next() {
let cur = count++
if (cur >= len) {
return !res.includes(false) && resolve(res)
}
const fn = reqArr[cur]
const data = await fn()
res[cur] = data
next()
}
})
}
const request = (delay, id) => {
return new Promise(resolve => {
console.log('n', delay, id)
setTimeout(resolve, delay, id)
})
}
const test_requests = [
() => request(6000, 1),
() => request(3000, 2),
() => request(4000, 3),
() => request(6000, 4),
() => request(1000, 5),
() => request(2000, 6),
]
multiRequest(test_requests, 4).then(res => {
console.log(res)
})