1

在 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(“循环终止”)”的函数。当我执行此代码时,console.log 从不打印任何内容。我对 Node.js 很陌生,我不太了解回调。有人可以向我解释为什么我的回调不起作用,我该如何解决?

4

1 回答 1

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

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

于 2013-04-30T04:45:59.087 回答