2016-07-07 12 views
0

FacebookのAPIを呼び出してデータを取得するforeachループを作成しました。しかし、呼び出し回数が多すぎるため、JavaScriptの最大呼び出しスタックサイズを超えてエラーが発生し、そこで停止します。 私は5分後または修正された時間間隔の後に各反復の実行を遅らせることを考えていました。 私はthis questionから助けを得ました。今私は知りたい、JavaScriptの呼び出しスタックをクリアするかどうかの時間間隔の後に各繰り返しを実行していますか?forループの次の繰り返しを遅らせると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ヒープメモリをクリアしたいと思います。

Error: FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

Aborted (core dumped)

+2

_whatを使用するようにしてください。はい、より良いソリューションがありますが、答えにあなたのコードコンテキストを置かなければなりません。 – Jai

+0

@Jai質問を誤解して申し訳ありません。ループの実行を解除すると、コールスタックがクリアされるかどうかを尋ねたいだけでしたか? –

+0

@DEVELOPERまあ、あなたのコードを見せてください...私はAPI呼び出しが非同期であると仮定しますので、呼び出しを遅らせる必要はありません – Cristy

答えて

0

set timeoutを使用してタイムアウトを増やすことができます。あなたは、オブジェクト内の各タイムアウトを保存することができます。

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

大きなタイムアウトを使用すると、JavaScriptのヒープがクリアされますか? –

+0

私は、JavaScriptヒープをクリアすることが何を意味するかについて完全にはわかりません。 JavaScriptのガベージは自動的に収集されます。 nodeJsが 'node --max_old_space_size = 8192'で起動することで、NodeJsが再生しなければならないメモリ量を増やすことができます。この他のスタックオーバーフロー[質問](http://stackoverflow.com/questions/26094420/fatal-error-call-and-retry-last-allocation-failed-process-out-of-memory)を参照してください。 –

+0

私は古いスペースのサイズを大きくしてもこの問題は解決しないと思います。将来的にクライアントの数が増えなければ、私はこのサイズを常に大きくすることはできません。私はその空間をクリアしたい。 –

0

UPDATE:OK、代わりにループを使用して、this._良く避けるあなたが捕まってしまった場所を確認するためにいくつかのコードを投稿する最善の解決策になる可能性のsetIntervalとグローバル変数 enter code here

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

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

致命的なエラー:CALL_AND_RETRY_LAST割り当てに失敗しました - JavaScriptヒープがメモリ不足になりました 中止(コアダンプ) –

+0

次の繰り返しを実行するためにjavascriptヒープメモリをクリアします。おかげさまで、 –

+0

私はこれを試してみる。 –

関連する問題