2013-08-12 96 views
0

所以我使用異步瀑布作爲我的過程將函數的結果傳遞給下一個。我目前在調用查詢導致的用戶推送時遇到問題。異步瀑布查詢不推?

這裏是我的代碼:

exports.contactList = function(req, res) { 

    async.waterfall([ 
    function(callback) { 

     Friend.findOne({userId: req.signedCookies.userid}, function(err, users) { 
      var friends = []; 
      if(err) {throw err}; 
      for(var i = 0; i < users.friendStatus.length; i++) { 
       if(users.friendStatus[i].status === 3) { friends.push(users.friendStatus[i])}; 
      } 
      //console.log(friends); 
      callback(null, friends); 
     }); 


     }, 

     function(friends, callback) { 
      var friendsinfo = []; 

      for(var i = 0; i < friends.length; i ++) { 
       async.each(friends, function(friend, next) { 
       //friendsinfo.push(friend.favorites) 


       User.findOne({_id: friend.fuId}, function(err, user) { 
        if (err) { console.log(err); }; 
         var object = {'fav': friend.favorites, 'user': user}; 
         friendsinfo.push(object); 
         next(err); 
       }); 
      }, function(err) { 
       console.log('friendsINFO'); 
       console.log(friendsinfo); 
       callback(err, friendsinfo); 
      }); 
      } 








     } 
    ], 

    function(err, results) { 
     console.log('RESULTS'); 
     console.log(results); 
     res.render('contactList', {title: 'Weblio', Friends: results}); 
    }); 

}; 

CONSOLE.LOG(用戶)實際打印出來的用戶。數組friendsInfo顯示爲未定義。

回答

1
function (friends, callback) { 
var friendsinfo = []; 

async.each(friends, function (friend, next) { 

    User.findOne({_id: friend.fuId}, function (err, user) { 
     friendsinfo.push(user); 
     next(err); 
    }); 
}, function (err) { 
    callback(err, friendsinfo); 
}); 
} 

剛剛清理從上面的回答的功能。認爲這是它應該看起來。

+0

問題是,您遺漏了需要與用戶信息一起添加的收藏夾。 – Lion789

+0

只需添加friendsinfo.push(friend.favorites);以上User.findOne – sbarow

+0

是的,但它沒有正確配對,我將結果添加到我的代碼 – Lion789

2

您在任何User.findOne完成之前調用callback(),因爲它們是異步的。使用async.each來解決這個問題。 編輯:或甚至更好地使用async.map來創建一個對象(按照@ Cam的建議)。

function (friends, callback) { 
    async.map(friends, function (friend, next) { 
     User.findOne({ _id: friend.fuId }, function (err, user) { 
      friendsinfo.push(user); 
      next(err, { 
       user: user, 
       favorites: friend.favorites 
      }); 
     }); 
    }, function (err, friendsinfo) { 
     callback(err, friendsinfo); 
    }); 
} 
+0

我從哪裏被調用?如果我使用async.each – Lion789

+0

另外,我希望將收藏夾作爲一個對象或數組中的一個子文檔與用戶一起推送 – Lion789

+0

@ Lion789我修復了代碼中的一些錯誤並選擇使用'async.map()'而是創建一個像@Cam建議的對象數組。 –