2013-04-30 26 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庫,但我強烈建議嘗試手動至少一次所有的異步模式