【问题标题】:Node.js: Callback function at the end of each iteration in a for loopNode.js:for循环中每次迭代结束时的回调函数
【发布时间】:2013-04-23 19:28:40
【问题描述】:

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

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

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

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

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

我使用了一个匿名函数,并且我试图回调一个将打印“console.log(“循环终止”)”的函数。当我执行此代码时,console.log 从不打印任何内容。我对 Node.js 很陌生,我不太了解回调。有人可以向我解释为什么我的回调不起作用,我该如何解决?

【问题讨论】:

    标签: node.js asynchronous callback


    【解决方案1】:

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

     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 库,但我强烈建议至少手动尝试所有异步模式一次

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-15
      • 2021-05-27
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 2013-12-24
      相关资源
      最近更新 更多