标签
NodeJS并发请求,并行请求,QPS限制,Axios并发限制,Axios并发请求
背景
由于调用第三方服务的API的时候,第三方对请求的QPS会有一定的限制,如百度的人脸识别接口,QPS=5,腾讯地图开放平台的普通账号QPS=5,那么在使用的过程中如果每秒请求数超过此限制,接口就会返回报错。导致请求失败。因此,需要在本地实现QPS的控制,当把多个Axios的请求扔到Promise队列中的时候,不会导致请求超限的问题。
众所周知,Promise对象的运行并不是等调用Promise.all()的时候才会执行,而是在创建这个Promise的时候就已经开始执行了,所以从Promise这块去下手显然是无法实现的,需要在扔进Promise[]数组的这些Promise中去实现限制。
更多关于Promise并发等问题请自行学习了解,今天以Axios为例进行展开讨论。
开始
对于一个Axios请求来说返回一个Promise,这个大家都知道的哈~ 正常的Axios请求大概写成这样:
const AXIOS = require('axios')
async function AA() {
let res = await AXIOS({
method: 'GET',
url: 'https://www.baidu.com'
}).then(res => res.data)
console.log(res)
}
如果需要100个并发请求,则可以利用Promise.all()来实现:
const AXIOS = require('axios')
async function BB() {
// 定义一个Promise数组
let pms = []
for (let i = 0; i < 100; i++) {
// 往pms中扔进去AXIOS返回的Promise对象们
pms.push(AXIOS({
method: 'GET',
url: 'https://www.baidu.com'
}).then(res => res.data).catch(err => console.error(err)))
}
// 通过Promise.all等待pms中所有的Promise执行完毕并返回结果给pms数组
pms = await Promise.all(pms)
console.log(pms)
}
首先,如上面所说,这个请求的Promise是在创建的时候就已经开始执行了(甚至还没push到pms[]中的时候它就已经在执行请求了)。所以如