如何从for循环将mongodb数据从内部函数异步发送到外部回调函数



新帖子:

以下是不带数据库的工作异步代码示例。问题是,如果我用db.collection.find()替换vars(data1_nodb,…);函数,在末尾接收到所有需要的db-var,而for()循环未结束对的我希望这能更好地解释我的问题。OA

        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读取数据,并通过回调将它们发送回下一个函数,需要数据库中的infos才能继续。

如果没有mongodb读取函数,它可以完美地工作,但现在我不知道怎么做我可以将两个内部函数中的db-var发送到第一个回调函数。

希望有人能帮我。。。感谢

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");
     });
 });

您的回调签名正在将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循环将在数据库返回结果之前结束。如果你真的需要循环,你可以尝试一个很好的流控制库

最新更新