2014-12-03 91 views
0

我的Process1()函數有一個數據庫循環,所以Process2()Process3()多次調用。我應該在async中使用哪個函數,等待for loopNode.Js異步用法

async.waterfall([ 
    function(callback){ 
     Process1(yyy, function(){ 
      //process1 function has a for loop. 
      callback(); 
     }) 
    }, 
    function(callback){ 
     Process2(function(){ 
      // so process2() is calling more than once 
      callback(); 
     }) 
    } 
], function (callback) { 
    Process3() 
}); 

處理1():

function Process1(yyy, pass){ 
user.find({}).exec(function(e, users){ 
    _.each(users, function(_user){ 
     user.findOneAndUpdate(
      {'_id' : user_id}, 
      {$inc : {'xxx' : yyy}}, 
     function(e){ 
      !e && pass() 
     }) 

    }) 
}) 
} 
+0

它會一直等待'for'循環。它必須。 – Brad 2014-12-03 19:14:54

+0

但是我必須在'process2'之前運行那個數據庫進程。沒有解決方案嗎? @布拉德謝謝。 – Lazy 2014-12-03 19:16:41

+0

這就是你在這裏顯示的代碼會發生什麼。只有在調用第一個閉包中的'callback'時,Process2纔會運行。 – Brad 2014-12-03 19:18:06

回答

1

看你的代碼,Process2肯定會被調用一次以上,因爲lodashunderscore不會等待回調發生。它們只是實用程序方法。

要解決asynchronous這樣的情況,請使用async.eachasync.eachSeries

function Process1(yyy, pass){ 
    user.find({}).exec(function(e, users){ 
    async.each(users, function(_user, next){ 
     user.findOneAndUpdate(
      {'_id' : user_id}, 
      {$inc : {'xxx' : yyy}}, 
     function(e){ 
      !e && next() 
     }) 
    }, function(err) { 
     pass(); 
    }) 
    }) 
} 
+0

非常感謝您,我已經瞭解了您的異步使用情況。 – Lazy 2014-12-03 19:35:26