Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.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 Node.js-如何在for循环中调用Facebook API而不超过速率限制?_Javascript_Node.js_Asynchronous_Promise - Fatal编程技术网

Javascript Node.js-如何在for循环中调用Facebook API而不超过速率限制?

Javascript Node.js-如何在for循环中调用Facebook API而不超过速率限制?,javascript,node.js,asynchronous,promise,Javascript,Node.js,Asynchronous,Promise,我有一个包含近200万个FacebookIDSender的数组,我想通过它来分享,为其中每一个调用一个FacebookAPI。 现在,由于异步性,如果我启动一个简单的for循环,Facebook将在4-5分钟后返回速率限制超过错误。 经过一些尝试,我发现避免速率限制的理想延迟是20毫秒 所以我尝试了这个解决方案:我将我的函数包装在承诺中,并使用setTimeout设置延迟 async function asyncLoop(values) { var prm = await new Promi

我有一个包含近200万个FacebookIDSender的数组,我想通过它来分享,为其中每一个调用一个FacebookAPI。 现在,由于异步性,如果我启动一个简单的for循环,Facebook将在4-5分钟后返回速率限制超过错误。 经过一些尝试,我发现避免速率限制的理想延迟是20毫秒

所以我尝试了这个解决方案:我将我的函数包装在承诺中,并使用setTimeout设置延迟

async function asyncLoop(values) {
  var prm = await new Promise(function(resolve, reject) {
    setTimeout(function() {
        for (var i=0; i<values.length; i++) {
            check(values[i].idSender, values[i].iscrizione, values[i].id_sito)
            if(checked == values.length) {
                resolve()
            }
        }
    },20);
  });
  return prm;
}

asyncLoop(idSenderArray)
异步函数asyncLoop(值){
var prm=等待新承诺(功能(解决、拒绝){
setTimeout(函数(){

for(var i=0;iJust
wait
for循环内的时间:

const timer = ms => new Promise(res => setTimeout(res, ms));

async function asyncLoop(values) {
  for (var i = 0; i < values.length; i++) {
    await timer(20);
    check(values[i].idSender, values[i].iscrizione, values[i].id_sito)
  }
}
const timer=ms=>newpromise(res=>setTimeout(res,ms));
异步函数asyncLoop(值){
对于(变量i=0;i
你也可以用承诺做类似的事情

var apiCall=(url,n)=>newpromise((v,x)=>setTimeout(v,50,`API调用的结果@${url}no${n}'),
调用=数组(20).fill()
.map((_,i)=>新承诺((v,x)=>设置超时(v,20*i))
.然后(=>apiCall(“http://facebook.com“,i))
.then(v=>console.log(`I'm doing with${v}`));
。作为控制台包装器{
身高:100%;
最大高度:100%!重要

}
或者,也可以使用带有承诺的setTimeout:

async function asyncLoop(values) {
    let apiCallPromises = values.map((value, index)=> new Promise(resolve=>{
        setTimeout(_=>{
            check(value.idSender, value.iscrizione, value.id_sito)
            resolve()
        }, index*20)
    }))

    return Promise.all(apiCallPromises);
}

它将每个值映射到一个
check()
每次后续请求的延迟为20n毫秒的调用。

尝试async.eachLimit而不是此处的承诺?通过限制并发调用而不是每次调用所需的时间,您可能会达到相同的目标。每2M个项目延迟20毫秒可使您获得11小时7分钟的运行时间。您多久执行一次此操作?我假设
检查
是一个异步函数,因此我还建议将此函数设置为基于承诺,然后使用
等待检查
,否则请求可能会由于网络延迟等原因开始交织,然后返回到速率限制错误。