Node.js:for循环中每次迭代结束时的callback函数

在Node.js中,我有一个遍历整个元素列表的函数,并执行一些数据库调用,如下所示:

for(var j=0; j<elements.length; j++) { //do some database calls } 

每个循环完成后(意思是当数据库调用终止时),我想“console.log(”Loop terminated“);”。 在下面的代码中,我已经展示了我的尝试来解决这个问题:

  for(var j=0; j<elements.length; j++) { (function() { //do some database calls })(function(){ console.log("Loop terminated"); }); } 

我使用了一个匿名函数,我试图callback函数,将打印“console.log(”循环终止“)”。 当我执行这个代码时,console.log不会打印任何东西。 我对Node.js很新,我不太了解callback。 有人可以向我解释为什么我的callback不起作用,我该如何解决?

如果您打算并行进行数据库调用:

  numCompletedCalls = 0 for(var j=0; j<elements.length; j++) { callDatabase(function(results) { numCompletedCalls++; if (numCompletedCalls == elements.length) console.log("Done all calls!"); }); } 

如果要保存所有结果,可以将其推送到allResults数组并检查其长度,而不是递增计数器。

如果你想要顺序循环,你需要有类似recursion的模式(注意,这不是实际的recursion)

  function iterateElements(elements, index, callback) { if (index == elements.length) return callback(); // do database call with element var ele = elements[index]; callDatabase(function(results) { iterateElements(elements, index+1, callback); }); } iterateElements(elements, 0, function() { console.log("Done all calls!"); }); 

大多数人倾向于使用asynchronous库,但我强烈build议手动尝试所有asynchronous模式至less一次