未推送异步瀑布查询?

Posted

技术标签:

【中文标题】未推送异步瀑布查询?【英文标题】:Async Waterfall query not pushed? 【发布时间】:2013-08-13 12:25:44 【问题描述】:

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

这是我的代码:

    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(user) 实际上打印出用户。数组friendsInfo 显示为未定义。

【问题讨论】:

【参考方案1】:

您在完成任何 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);
    );

【讨论】:

我是从哪里来的?如果我使用 async.each 另外,我希望将收藏夹作为数组中的一个对象或一个子文档与用户一起推送 @Lion789 我修复了代码中的一些错误,并选择使用async.map() 来创建@Cam 建议的对象数组。 为什么 async map vs each?我只问是因为每个人目前都在工作吗? 代码少:) 通常 .map 用于将数组转换为新数组,在这种情况下,将朋友数组转换为用户数组。 .each 也可以,但您需要自己跟踪新数组。【参考方案2】:
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);
);

刚刚从上面的答案中清理了功能。认为它应该是这样的。

【讨论】:

问题是您遗漏了需要与用户信息一起添加的收藏夹。 只需添加friendsinfo.push(friend.favorites);上面 User.findOne 是的,试过了,但是两者没有正确配对,我将结果添加到我的代码中 我认为您应该做的是创建一个对象,然后将该对象推送到数组中。 var object = 'favourite' : friend.favorites, 'user' : user; 好吧,这确实有效,但是我如何访问对象的用户部分内的 id?

以上是关于未推送异步瀑布查询?的主要内容,如果未能解决你的问题,请参考以下文章

在 node.js 中使用异步瀑布

带有异步队列和瀑布的猫鼬

将异步函数添加到异步瀑布

异步瀑布中带有 Mysql 连接池的 ForEach 函数

将参数传递给 Node.js 异步瀑布

与 Promise 一起使用时,异步瀑布不执行下一个回调方法