主题
并发请求
在一些场景下面,需要同时发送多条请求,当然,也需要控制并发数,毕竟带宽有限。
思路
js
/**
* 并发请求
* @param {*} urls 请求 url 数组
* @param {*} maxNum 并发请求数量
*/
function concurRequest(urls, maxNum) {
return new Promise(resolve => {
if (urls.length === 0) {
resolve([])
return
}
const results = []
let index = 0 // 下一个请求的下标
let count = 0 // 当前请求完成的数量
// 发送请求
async function _request() {
if (index >= urls.length) {
return
}
const i = index
const url = urls[index]
index++
console.log(url)
try {
const resp = await fetch(url)
results[i] = resp // 保证返回结果中顺序和请求顺序一致
} catch (err) {
results[i] = err // 保证返回结果中顺序和请求顺序一致
} finally {
// 判断所有请求是否都已完成
count++
if (count === urls.length) {
// console.log('请求结束', results)
resolve(results)
}
_request()
}
}
const times = Math.min(maxNum, urls.length)
for (let i = 0; i < times; i++) {
_request()
}
})
}
使用示例:
js
const urls = []
for (let i = 1; i <= 10; i++) {
urls.push(`https://jsonplaceholder.typicode.com/todos/${i}`)
}
concurRequest(urls, 3).then(resps => {
console.log(resps)
})