应用异步 nodejs

Posted

技术标签:

【中文标题】应用异步 nodejs【英文标题】:Applying async nodejs 【发布时间】:2013-08-13 09:43:03 【问题描述】:

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

更新:将 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);
    );

;

【问题讨论】:

【参考方案1】:

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

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'    
);

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

[edit]更好的缩进,并在最后一个回调中将结果变量更改为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);
);

;

【讨论】:

以上是关于应用异步 nodejs的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS的异步编程风格

Nodejs 异步承诺队列

[NodeJS]Node异步编程基础

如何从请求中返回结果,以及在 NodeJS 中执行异步任务但没有回调之后

nodejs 异步应该如何处理

为啥说nodejs是异步非阻塞