我创建了一个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堆内存不足
中止(核心倾销)
答案 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)