【问题标题】:How to send mongodb data async from inner functions to outside callback function from a for loop?如何从for循环将mongodb数据异步从内部函数发送到外部回调函数?
【发布时间】:2012-08-03 11:28:01
【问题描述】:

新帖子:

这是没有数据库的工作异步代码示例。 问题是,如果我用 db.collection.find(); 替换 vars (data1_nodb,...); 函数,最后收到所有需要的 db var,并且 for() 循环没有结束 正确的。我希望这能更好地解释我的问题。办公自动化

        var calc = new Array();
        function mach1(callback){               
                    
                            error_buy = 0;                                                  
                            
                            // some vars                            
                            
                            for(var x_c99 = 0; x_c99 < array_temp_check0.length;x_c99++){
                                
                                // some vars                        
                                    
                                    calc[x_c99] = new Array();                                      
                                    calc[x_c99][0]= new Array();    
                                    
                                    calc[x_c99][0][0] = "dummy1";
                                    calc[x_c99][0][1] = "dummy2";
                                    calc[x_c99][0][2] = "dummy3";
                                    calc[x_c99][0][3] = "dummy4";
                                    calc[x_c99][0][4] = "dummy5";
                                    
                                    function start_query(callback) {

                                            data1_nodb = "data1";
                                            data2_nodb = "data2";
                                            data3_nodb = "data3";
                                            data4_nodb = "data4";

                                            
                                            calc[x_c99][0][0] = data1_nodb;
                                            calc[x_c99][0][1] = data2_nodb;
                                            calc[x_c99][0][2] = data3_nodb;
                                                        
                                        
                                            callback(data1_nodb,data2_nodb,etc..);
                                            
                                    }
                                        
                                            start_query(function() {
                                                
                                                console.log("start_query OK!"); 
                                                
                                                function start_query2(callback) {
                                                                    
                                                data4_nodb = "data5";
                                                data5_nodb = "data6";
                                                data6_nodb = "data7";
                                                
                                                
                                                calc[x_c99][0][3] = data4_nodb;
                                                calc[x_c99][0][4] = data5_nodb;
                                                    
                                                callback(data5_nodb,data6_nodb,etc..);
                                                
                                            }                                           
                                            
                                            start_query2(function() {
                                                
                                                console.log("start_query2 OK!");    
                                                
                                                    function start_query3(callback) {
                                                        
                                                            
                                                        for(...){
                                                            
                                                                // do something
                                                            }
                                                        
                                                            callback(vars...);                                              
                                                        }
                                            
                                                start_query3(function() {
                                                    console.log("start_query3 OK!");    
                                                });
                                            
                                            });
                                        }); 
                                }
                            
                            callback(calc); 
                
                    };
                    
                    
                    function mach2(callback){
                                    
                        mach1(function() {
                            
                            console.log("mach1 OK!");
                
                            for(...){                                                                                               
                            // do something                                                         
                            }   
                                                
                        });         
    
                        callback(calc,error_buy);
                        
                    };                          
                        
                    mach2(function() {
                    console.log("mach2 OK 2!");                                         
                    });

旧帖:

我尝试从 mongodb 中读取数据并通过回调将它们发送回下一个 函数,它需要来自数据库的信息才能继续。

如果没有 mongodb 读取功能,它可以完美运行,但现在我不知道如何 我可以将两个内部函数中的 db vars 发送到第一个回调函数。

希望有人可以帮助我... 谢谢

var 错误 = 0; var var1 = "是的";

函数 start_query(回调) {

var db_name = "db1";

db[db_name].find({name:var1},{data1:1, data2:1, data3:1, data4:1}, function(err, data_catch,callback) {
    
    if( err || !data_catch ) {
        console.log("Problem finding data_catch:" + err);
    
    } else {
        
        data_catch.forEach( function(data_catch_finder,callback) {
        
            data1_db = data_catch_finder.data1;
            data2_db = data_catch_finder.data2;
            data3_db = data_catch_finder.data3;
            data4_db = data_catch_finder.data4;
                                                            
            if(data1_db == "" || data2_db == "" || data3_db == "" || data4_db == ""){error = 1; console.log("Error: data_catch_finder");}
             
             callback(data1_db, data2_db, data3_db, data4_db, error);
     
        }); 
      
    }
});
        
        
    callback(data1, data2, data3, data4, error);
        
}
             
//########################################################################
 
 start_query(function() {
     
     function start_query2(callback) {
         
         console.log("DATA1 from callback:" + data1_db);
         console.log("DATA2 from callback:" + data2_db);
         console.log("DATA3 from callback:" + data3_db);
         console.log("DATA4 from callback:" + data4_db);
         
         var var_no_db = "testing";
         
         //do something else and callback
         
         callback(var_no_db);
         
     }
     
     
     start_query2(function() {
         
         console.log("Var from callback start_query2:" + var_no_db);
         console.log("The end");
     });
 });

【问题讨论】:

    标签: node.js mongodb for-loop callback


    【解决方案1】:

    您的回调签名正在发出 callback 作为参数。

    据我了解您的代码,您需要保留第一个回调的引用,即您在此处收到的那个:function start_query(callback)

    在每个回调函数中,您都错误地将变量名称 callback 绑定到来自 mongo 驱动程序的参数(我认为是一个简单的 undefined)。

    您可以修复它,从内部函数的签名中删除 callback 的每个引用。

    一个简单的例子:

    function async (cb) {
      // params: Error, data
      cb(null, 'moo');
    }
    
    function foo(callback) {
      async(function(err, data, callback){
        console.log(callback); // undefined
      });
    
      console.log(callback); // Moo
    }
    
    foo('Moo');
    

    看看Eloquent Javascript,更好地理解JS上下文切换;


    编辑

    等待异步函数结果的唯一方法是在最后一个嵌套回调中调用第一个回调。

    function ugly_nested (callback) {
      dbquery('...', function(err, data_01) {
        if (!! err) return callback(err);
    
        dbquery('...', function(err, data_02) {
          if (!! err) return callback(err);
    
          dbquery('...', function(err, data_03) {
            if (!! err) return callback(err);
    
            callback(null, data_01, data_02, data_03);
          });
        });
      });
    }
    
    ugly_nested(function(err, data01, data02, data03) {
      if (!! err) throw err;
    
      manage_data(data01, data02, data03);
    });
    

    FOR 循环是同步的,但是,数据库调用是异步的,因此,for 循环将在数据库返回其结果之前结束。如果你真的需要那个 for 循环,你可以尝试一个不错的 flow control libraries out there

    【讨论】:

    • 谢谢!我发布了一个工作代码的示例,没有 db。希望更好理解。办公自动化
    猜你喜欢
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多