具有回调的for循环中的mongodb数据异步?

时间:2012-08-04 19:18:54

标签: node.js mongodb for-loop

以下是没有mongodb的工作异步代码示例。问题是,如果我用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!");                                         
                });

1 个答案:

答案 0 :(得分:0)

您需要使用collection.find()方法的异步性质并等待所有这些方法完成。一种非常流行的方法是使用async模块。此模块允许您运行多个并行任务,并等待它们使用async.parallel()方法完成:

async.parallel([
  function (callback) {
    db.foo.find({}, callback);
  },
  function (callback) {
    db.bar.find({}, callback);
  },
  function (callback) {
    db.baz.find({}, callback);
  }
], function (err, results) {
  // results[0] is the result of the first query, etc
});