2013-04-30 66 views
1

在Node.js的回调函数我已经如下所示,通过元件的整个不胜枚举和做一些数据库调用的函数:Node.js的:在每一次迭代的在一个末端for循环

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

我在的地方使用匿名函数,我试图回调,将打印功能“的console.log(”循环结束“)” 。当我执行此代码时,console.log不会打印任何内容。我对Node.js非常陌生,我不太了解回调。有人可以向我解释为什么我的回调不起作用,我该如何解决?

回答

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阵列中的所有结果,并检查它的长度,而不是递增计数器。

如果你想为循环顺序,你需要有递归样模式(请注意,这不是真正的递归)

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

相关问题