2013-02-03 34 views
1

在開始大喊「不要使用for-loops with async functions!」之前!讓我說我知道如何編程一個循環與異步函數調用回調中的下一個迭代。具有異步功能的for循環耗盡內存

但是,如果我對回調沒有興趣,或者只有在前任完成時才處理一次迭代。在我的情況下,我從XML文件導入大量記錄並將它們寫入到mongoDB中。我的「寫」 - 函數正常通話會是這樣的:

asyncWrite(record, function(err, result) { 
    ... 
}); 

現在,正如我所說,即時通訊在回調不感興趣(不會發生錯誤!),也不在一個連續的過程。所以我使用了一個for循環,並忽略了回調:

for(i=0; i<max; i+=1) { 
    asyncWrite(record_arr[i]); 
} 

對於小型max這很好。但隨着max變大(> 100.000),我最終得到'內存不足'的錯誤。防止這種情況的唯一方法是回到'正常'異步循環(回調中的遞歸函數調用)。

還有其他想法嗎?

+0

您正在調用函數asyncWrite(record_arr [i])「。函數的另一個參數在哪裏? – polin

+0

也許嘗試process.nextTick(function(){asyncWrite(record_arr [i]);}); – Chris

+0

@polin:我按意願離開了它,因爲正如我所說的,我不想在回調中處理任何東西。 – heinob

回答

5

直到for循環完成其工作後纔會執行異步函數。它剛剛收集到一個太乞丐的隊列。對於大max,你得到了out of memory錯誤,因爲隊列已滿。你可以通過在循環中插入console.log(process.memoryUsage());來查看你的內存泄漏情況。您需要使用塊來處理此任務。

+0

是的,你的解釋後絕對清楚。 – heinob