异步瀑布查询没推?

时间:2013-08-12 08:46:46

标签: node.js function mongodb asynchronous mongoose

所以我使用异步瀑布作为我的程序将函数的结果传递给下一个。我目前在调用由查询引起的用户推送时遇到问题。

这是我的代码:

    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显示为未定义。

2 个答案:

答案 0 :(得分: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);
    });
}

答案 1 :(得分: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);
});
}

刚从上面的答案清理了这个功能。想想它应该是什么样子。