开始大喊“不要使用带有异步功能的for循环!”让我说明我做知道如何使用异步函数编写一个循环来调用回调中的下一个迭代。
但是,如果我对回调或处理一次迭代不感兴趣,只有前一个已经完成。在我的例子中,我从xml文件导入大量记录并将它们写入mongoDB。对我的“写”功能的正常调用将是这样的:
asyncWrite( record, function(err, result) {
...
});
现在正如我所说,我对回调不感兴趣(不会发生错误!)也不会在串行进程中。所以我使用了for-loop并省略了回调:
for( i=0; i<max; i+=1) {
asyncWrite( record_arr[i] );
}
对于小max
,这非常有效。但随着max
越来越大(> 100.000),我最终得到了“内存不足”的错误。防止这种情况的唯一方法是转回“正常”异步循环(来自回调内的递归函数调用)。
还有其他想法吗?
答案 0 :(得分:6)
在for循环完成其工作之前,不会执行异步函数。它刚刚收集了一个太乞讨的队列。对于大max
,您遇到out of memory
错误,因为队列已满。您可以通过在循环内部插入console.log(process.memoryUsage());
来查看内存是如何泄漏的。您需要使用块来处理此任务。