0

最新帖子:

这是没有数据库的工作异步代码的示例。问题是,如果我用 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 读取数据并通过回调将它们发送回下一个函数,该函数需要来自 db 的信息才能继续。

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

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

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

功能启动查询(回调){

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

1 回答 1

0

您的回调签名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 循环,你可以尝试其中一个不错的控制

于 2012-08-03T14:18:29.873 回答