function concurrencyRequest (urls, limit) {
return new Promise(resolve => {
if(urls.length === 0) {
resolve([])
return
}
let nextIndex = 0
const result = []
let count = 0
async function _request() {
const idx = nextIndex
nextIndex++
try {
// 这个地方后边如果是同步任务的话,resolve的时候会多输出limit - 1个结果。原因并发额外的递归任完成的时候,实际会执行urls.length +( limit - 1) 次result[idx] = xxx, 而异步任务是微任务,会等执行栈结束才最后执行 result[idx] = xxx
result[idx] = await fetch(`https://jsonplaceholder.typicode.com/todos/${idx}`)
} catch(e) {
result[idx] = e
}
if(nextIndex < urls.length) {
_request()
}
count++
if(count >= urls.length) {
resolve(result)
return
}
}
for(let i = 0; i < Math.min(urls.length, limit); i++) {
_request()
}
})
}
concurrencyRequest(new Array(20).fill(1), limit).then(res => {
console.log(res);
})