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

时间:2013-04-30 00:26:56

标签: node.js asynchronous callback

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

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

每个循环结束后(意味着当数据库调用终止时),我想“console.log(”循环终止“);”。在下面的代码中,我展示了我尝试解决此问题的方法:

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

     })(function(){
        console.log("Loop terminated");
       });
 }

我使用了匿名函数,我正在尝试回调一个将打印“console.log(”Loop terminated“)”的函数。当我执行此代码时,console.log永远不会打印任何内容。我是Node.js的新手,我不太了解回调。有人可以向我解释为什么我的回调不起作用,我该如何解决?

1 个答案:

答案 0 :(得分:6)

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

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

    });
 }

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

如果你想要顺序for循环,你需要有类似递归的模式(注意它实际上不是递归)

 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!");
 });

大多数人倾向于使用async库,但我强烈建议至少手动尝试所有异步模式