Promise解决并发请求和async/await解决并发请求
有的时候会出现一种情况,就是你需要调用多次API,因为可能调一次返回的数据量过大,占满了带宽就直接卡死,但是你又不想每次只调用一个,想每次调用多个,你就可以尝试下面的方法:
使用Promise解决并发问题
function async concurrentRequests(args, len = 10) {
const recordArr = 0 // 用来记录当前有多少个请求
for(let i = 0; i < args.length; i++) {
const rsp = request(i) // 假设这就是我们的请求
recordArr++ // 请求数加一
rsp?.then((res, rej) => {
if(res?.Status === 'success') { // 假设我们以请求结果的Status判断成功与否
// 进行正常的业务交流
}
recordArr--
})
if(recordArr.length === len) { // 到达极限了
await Promise.race(recordArr) // 等待recordArr的变化
}
}
}
使用async/await控制并发请求
async function concurrentRequests(urls, limit = 5) {
const queue = urls.map(url => fetch(url)) // 将请求放到一个数组队列中
return new Promise((resolve, reject) => {
const results = [] // 记录结果数组
let count = 0 // 记录当前请求量
const next = async () => {
if(queue.length > 0) {
while(queue.length > 0 && count < limit) {
count++
const req = queue.shift() // 取出请求
req().then(res => {
results.push(result)
}).catch(err => {
console.error(err)
}).finally(() => {
count-- // 放出
next()
})
}
} else if(count === 0) {
resolve(results)
}
}
next()
})
}
行百里者半九十