2014-03-07 73 views
1

什麼是的最佳方式確保在此代碼段更新的MongoDB數據庫前的for循環完成其處理如何使用MongoDB和node.js處理異步?

var userIdArray = [] // contains 100000 userIds 

User.find({'_id': {$in: userIdArray}}, 'name', function(err, result){ 
    var thisTime = new Date().getTime(); 

    var usersArray = []; 
    for (var i = 0; i < result.length; i++) { 
     var user = result[i]; 
     var userObject = { 
      userId: user['_id'], 
      userName: user.name, 
      time: thisTime 
     } 
     usersArray.push(userObject); 
    }; 

    Model.update(id, 
     {$pullAll: {userIds: userIdArray}, $push: {users: {$each: usersArray}}}, 
     function(err, result) { 
      //continue to do stuff 
     } 
    ); 
}); 
+1

執行異步操作('Model.update')**之後** for循環,總是。因爲'for'循環內沒有任何異步。見:http://stackoverflow.com/questions/16336367/what-is-the-difference-between-synchronous-and-asynchronous-programming-in-node – TheBronx

+0

@TheBronx謝謝你!因此,如果在for循環中有另一個MongoDB數據庫調用,是否會改變這種情況? – AmpT

+1

當然'Model.update'將在循環中的**同步操作**之後執行,但並不總是在內部添加的異步任務之後執行。一旦你的同步代碼被執行,Node.js將「檢查」已完成的異步任務(也就是說,一旦'Model.update'任務被**排隊**)並執行它的回調函數。您可以在Node.js中閱讀關於** Event Loop **的更多信息:http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/ – TheBronx

回答

2

您的循環有所有順序和同步操作。它會在你的mongo更新被觸發前總是完成。