初始化
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) {// 返回Promisereturn 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, '所有请求返回结果')
})