0

如何将异步系列应用于此代码...我在查询和正确使用结果时遇到问题...我需要获取 user.friendStatus ,它是用户在 Friend 集合中拥有的所有朋友的列表和然后,获取朋友的每个 id 并从 User 集合中找到用户信息...

更新:将 async.series 更改为 async.waterfall 以便我可以将一个结果传递给下一个函数。但是,我不确定您如何调用并将结果从一个传递到另一个...

这是我的代码:

    exports.contactList = function(req, res) {

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

        function(callback) {
            var friendsinfo = [];
            for(var i = 0; i < friends.length; i++) {
                User.findbyID({_id: friends[i].fuID}, function(err, users) {
                    if (err) { throw err};
                    friendsInfo.push(users[i], friends[i].favorites);
                });
            }
            callback(null, friendsinfo);
        }
    ],

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

};
4

1 回答 1

1

这是来自https://github.com/caolan/async#waterfall的 async.waterfall 示例 我添加了更多评论让我清楚

async.waterfall([
    function(callback){
        callback(null, 'one', 'two');
    },
    function(arg1, arg2, callback){
        // arg1 is equal 'one'
        // arg2 is equal 'two
        callback(null, 'three');
    },
    function(arg1, callback){
        // arg1 now equals 'three'
        callback(null, 'done');
    }
], function (err, result) {
   // result now equals 'done'    
});

[编辑]应用于您的代码...(注意只是将朋友参数添加到第二个函数)

[编辑]更好的缩进,并在最后一个回调中将结果 var 更改为 friendsinfo

 exports.contactList = function(req, res) {

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

    function(friends, callback) {
        var friendsinfo = [];
        for(var i = 0; i < friends.length; i++) {
            User.findbyID({_id: friends[i].fuID}, function(err, users) {
                if (err) { throw err};
                friendsInfo.push(users[i], friends[i].favorites);
            });
        }
        callback(null, friendsinfo);
    }
],

function(err, friendsinfo) {
    res.render('contactList', {title: 'Weblio', Friends: friendsinfo});
});

};

于 2013-08-12T07:39:15.127 回答