Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过带请求速率限制器的API的异步请求_Javascript_Python_Node.js_Api - Fatal编程技术网

Javascript 通过带请求速率限制器的API的异步请求

Javascript 通过带请求速率限制器的API的异步请求,javascript,python,node.js,api,Javascript,Python,Node.js,Api,我在一个项目中工作,需要通过API发出请求。请求返回关于支持票证的数据,但问题是我有大约500个票证要获取数据,每个票证都需要一个请求。为了加快请求的速度,我尝试构建一个异步例程,同时生成多个请求。但是,由于我正在集成的API具有每秒10个请求的速率限制,因此一些例程得到的答案是“Limit Over”。如果我按顺序提出请求,大约需要5分钟 那样的话,有人能给我一个提示吗?我尝试了一些解决方案,比如NodeJS的速率限制器,但它只同时生成10个请求,并且没有给出任何错误处理或在请求失败时重试 关

我在一个项目中工作,需要通过API发出请求。请求返回关于支持票证的数据,但问题是我有大约500个票证要获取数据,每个票证都需要一个请求。为了加快请求的速度,我尝试构建一个异步例程,同时生成多个请求。但是,由于我正在集成的API具有每秒10个请求的速率限制,因此一些例程得到的答案是“Limit Over”。如果我按顺序提出请求,大约需要5分钟

那样的话,有人能给我一个提示吗?我尝试了一些解决方案,比如NodeJS的速率限制器,但它只同时生成10个请求,并且没有给出任何错误处理或在请求失败时重试


关于语言,它没有限制,项目是用NodeJS编写的,但是也有一些python代码,并且在集成另一种语言时没有问题。

这样的东西不太难自己创建,而且它会给您所需的灵活性

有很多奇特的方法,比如跟踪每个邮件的开始和完成时间,检查你是否在一秒钟内发送了10封邮件

系统可能还将其限制为10个活动请求(即,您不能启动100个请求,每秒10个,然后让它们全部处理)

如果你假设这一点,我会说一次发布10个,然后让它们完成,然后发布下一批。您还可以启动10个,然后每次启动一个附加的。你可以把它想象成一个“

您可以通过一个简单的变量跟踪正在进行的呼叫数来轻松地跟踪这一点。然后,只需检查每秒有多少个调用(以避免1秒的限制),如果您有可用的“线程”,则发出更多的新请求

它可能看起来像这样:

const threadLimit=10;
恒速限值=1000;//太太
让activeThreads=0;
const calls=新数组(100).fill(1).map((uu,index)=>index);//创建一个0到99的数组只是一个示例
函数运行(){
if(calls.length==0){
console.log('complete');
返回;
}
//threadLimit-activeThreads是我们可以启动的新线程数
对于(让i=0;i0;i++){
activeThreads++;//添加线程
调用(calls.shift())
.然后(完成);
}
设置间隔(运行、速率限制);
}
功能完成(val){
log(`Done${val}`);
activeThreads--;//删除线程
}
函数调用(val){
log(`Starting${val}`);
返回新承诺(resolve=>waitToFinish(resolve,val));
}
//模拟网络呼叫的随机函数
函数waitToFinish(解析,val){
const done=Math.random()<.1;//完成的几率为10%
完成和解决(val)
如果(!done)setInterval(()=>waitToFinish(resolve,val),则为10;
已完成的返回;
}

run()尝试
setInterval