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

时间:2012-08-03 11:28:02

标签: node.js mongodb for-loop callback

新帖子:

以下是没有db的工作异步代码示例。 问题是,如果我用db.collection.find()替换vars(data1_nodb,...);  函数,结束时收到的所有必需的db变量,而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读取数据并通过回调将其发送回下一个 函数,需要db中的信息才能继续。

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

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

  

var error = 0; var var1 =“yessir”;

     

function start_query(callback){

     

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

1 个答案:

答案 0 :(得分: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循环,你可以尝试一个不错的flow control libraries out there