【问题标题】:Callback after X amount of async mongo queries not running.X 数量的异步 mongo 查询未运行后的回调。
【发布时间】:2014-01-02 18:46:21
【问题描述】:

由于某种原因,此回调从未被触发。有 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);                                                
            }                                                                        
        });                                                                          
    });                                                                              
});   

【问题讨论】:

    标签: node.js mongodb async.js


    【解决方案1】:

    您的迭代器缺少回调函数。如果您查看文档 (link here),在参数列表下,each 的第二个参数(迭代器)接受消息和回调。摘录如下:

    iterator(item, callback) - 应用于每个项目的函数 大批。迭代器被传递了一个必须调用的回调(错误) 一旦完成。如果没有发生错误,回调应该是 不带参数或带显式 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()

    【讨论】:

    • 啊,我明白了。我对有 2 个回调的事实感到困惑:每个项目一个,一个整体一个。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 2011-12-03
    • 2021-04-30
    • 2017-11-21
    相关资源
    最近更新 更多