X量异步mongo查询未运行后回调。

时间:2014-01-02 10:15:01

标签: node.js mongodb async.js

由于某种原因,永远不会触发此回调。有2条消息,正确地说,输出是:

10
12
12
20
20
26
26
然后在回调运行时输出

然后30,但它永远不会输出。

app.get("/getMessages", function (req, res) {                                        
    var JSONtoSend = [];                                                             
    getAllMessages(req.session.cur_user, function ( messages ) {                     
        console.log("10");                                                           
        async.each(messages, function (message) {                                    
            console.log("12");                                                       
            User.findById(message.senderId, function (sender) {                      
                console.log("20");                                                   
                User.findById(message.recieverId, function (reciever) {              
                    console.log("26");                                               
                    JSONtoSend.push({ content:message.content, reciever: reciever, sender: sender });
                });                                                                  
            });                                                                      
        }, function (err) { // this is the callback                                  
            if (err) {                                                               
                console.log(err);                                                    
            } else {                                                                                                                                                        
                console.log("30");                                                   
                res.json(JSONtoSend);                                                
            }                                                                        
        });                                                                          
    });                                                                              
});   

1 个答案:

答案 0 :(得分:3)

你错过了迭代器的回调函数。如果检查文档(link here),则在参数列表下,each的第二个参数(迭代器)同时接收消息和回调。这是摘录:

  

iterator(item,callback) - 一个应用于每个项目的函数   阵列。迭代器传递一个必须被调用的回调(err)   一旦完成。如果没有发生错误,则应该回调   不带参数或使用显式null参数运行。

所有迭代器函数完成后,

async只会运行你的最终回调 - 并且调用迭代器的回调是async如何跟踪完成的数量。

尝试以下方法:

app.get("/getMessages", function (req, res) {                                        
    var JSONtoSend = [];                                                             
    getAllMessages(req.session.cur_user, function ( messages ) {                     
        console.log("10");                                                           
        async.each(messages, function (message, callback) {                                    
            console.log("12");                                                       
            User.findById(message.senderId, function (sender) {                      
                console.log("20");                                                   
                User.findById(message.recieverId, function (reciever) {              
                    console.log("26");                                               
                    JSONtoSend.push({ content:message.content, reciever: reciever, sender: sender });
                    callback();
                });                                                                  
            });                                                                      
        }, function (err) { // this is the callback                                  
            if (err) {                                                               
                console.log(err);                                                    
            } else {                                                                                                                                                        
                console.log("30");                                                   
                res.json(JSONtoSend);                                                
            }                                                                        
        });                                                                          
    });                                                                              
}); 

理想情况下,您还会将任何可能的错误传递给callback()