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

Fra*_*nXh 1 asynchronous callback node.js

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

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

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

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

     })(function(){
        console.log("Loop terminated");
       });
 }
Run Code Online (Sandbox Code Playgroud)

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

And*_*rov 6

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

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

    });
 }
Run Code Online (Sandbox Code Playgroud)

如果你要保存所有结果,你可以推送到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!");
 });
Run Code Online (Sandbox Code Playgroud)

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