2017-10-29 37 views
0

我有一個執行三個mongooose命令的函數。 1.查找所有合作伙伴的列表。 2.查找所有用戶的列表。 3.更新用戶表。以同步方式串聯貓鼬查詢

問題:Mongoose是異步執行的,它執行其他命令。我如何讓它以1,2,3的順序執行,然後執行其他命令。下面,我附上了一段代碼片段。

問題在於它會異步運行三個mongoose命令並調用redirect()。

router.post('/login', function(req, res, next) { 
    Partner.findOne({'groupName': req.session.user.groupnName}), function(error, data) { 
    var partnerInfo = data; 
    if(partnerInfo && req.session.user) { 
     req.session.user.accountID = partnerInfo.accountID; 
     req.session.user.iamRole = partnerInfo.iamRole; 
    } 
    }; 
var id; 
User.find({'username': req.session.user.username}, function(err, data) { 
    if(data) { 
     id = data._id; 
    } 
    }); 

User.findByIdAndUpdate(id, req.session.user, function(error) {}); 
return res.redirect('/home'); 
}); 
+0

閱讀上如何使用回調。甚至承諾。貓鼬也支持這一點。 https://docs.nodejitsu.com/articles/getting-started/control-flow/what-are-callbacks/ – Roshan

+0

使用async.waterfall([fn1,fn2,...],cb):https:// www .npmjs.com/package/async-waterfall –

回答

0

您應該將調用嵌套在回調函數中。

func1(args, function(){ 
    // do something here 
    func2(someMoreArgs, function(){ 
     // do something more here 
     func3(andMore, function(){ 

     }) 
    }) 
}) 

如果你想避免嵌套回調,使用蒙戈 - 客戶的承諾接口或貓鼬

+0

哦,請不要。不是飛行的V! –

+0

@NeilLunn即使我會避免嵌套回調。解決方案將使用Promises來代替。 –

+0

那麼不要發佈這樣的糟粕,如果你不會自己做。沒有必要在有[優秀資源](https://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call)解釋返回值和傳遞值與各種可用的方法。肯定更有幫助,那麼「嵌套回調」你不覺得嗎? (修辭問題 - 所以不要回答,只是想)。 –