初始化
const axios = require('axios')
const apis = ['url1', 'url2', 'url3'] // 模拟 http apis
并发函数
/**
* @param {Array<string>} apis
* @param {number} maxNum 最大并发量
* @returns {Promise}
*/
/**
* @param {Array<string>} apis 请求的API集
* @param {number} maxNum 最大并发量
* @returns {Promise}
*/
function getConcurApi(apis, maxNum) {
// 返回Promise
return new Promise(resolve => {
// 请求数空\返回空值
if (apis.length === 0) {
resolve([])
return
}
const results = [] // 将返回的所有结果插入数组
let index = 0 // 当前请求的下标
let count = 0 // 当前完成量
// 异步请求函数
async function request() {
// 请求数超过
if (index === apis.length) {
return
}
const i = index // 原始的下标
const url = apis[index] // 对应下标请求地址
index++ // 下一个请求的下标
try {
const resp = await axios.get(url)
results[i] = resp.data // 对应下标保存对应返回结果
} catch (err) {
results[i] = err // 错误
} finally {
count++ // 每完成一个请求量+1
// 判断所有请求完毕
if (count === apis.length) {
console.log('api is over')
resolve(results)
}
request() // 无论成功或错误,都请求下一个请求
}
}
// 并发量控制 - 并发量不能超过总请求数
const times = Math.min(maxNum, apis.length)
for (let x = 0; x < times; x++) {
request()
}
})
}
测试
// 测试
getConcurApi(apis, 2).then(val => {
console.log(val, '所有请求返回结果')
})