延迟for循环中的下一次迭代是否会清除JavaScript调用堆栈?

时间:2016-07-07 09:27:59

标签: javascript node.js

我创建了一个foreach循环,它调用Facebook的API来获取数据。但由于调用次数过多,因此会出现JavaScript的最大调用堆栈大小已超出的错误,并在此处停止。 我想在5分钟或修复时间间隔后延迟每次迭代的执行。 我从this question获得了帮助。现在我想知道,在一段时间之后执行每次迭代是否清除了JavaScript调用堆栈?

代码:

var updateFeeds = function(){
        db.collection("accounts").find({"status": "live"}).toArray(function(err, clients) {
        var interval = 10 * 1000;
        var i = 0;
        clients.forEach(function(client, index, array){
            setTimeout( function (i) {
                i++;
               ****code*****

            }, interval * i, i);
        });

对于每个客户端,代码中有近5000个请求调用。我希望在每次迭代完成后清除JavaScript堆内存。

  

错误:致命错误:CALL_AND_RETRY_LAST分配失败 - JavaScript堆内存不足

     

中止(核心倾销)

2 个答案:

答案 0 :(得分:0)

您可以使用设置超时增加超时。您可以将每个超时存储在对象中:

var calls = {};
var urls = {
    'first': 'http://...',
    'second': 'http://...',
}
var timeout = 0;

for (var i in urls) {
    calls[i] = setTimeout(function(){
        // Make call here with urls[i];
    }, timeout);
    timeout + 5000;  // Adds 5 seconds
} 

然后,如果您需要取消任何超时,可以使用clearTimeout(calls['first'])

Facebook API非常广泛,也许您可​​以使用不同的调用从一个响应中的所有调用中获取数据。

答案 1 :(得分:0)

更新:好的,改为使用循环,尝试使用setInterval和全局变量  enter code here

 globalArrayIndex = 0 
 myInterval = setInertval(function(){
      globalArrayIndex++
     /*code*/

     if(noMoremembers)
        clearInterval(myInterval)
 }, 5000)