2012-08-03 63 views
0

NEW POST:如何將mongodb數據async從內部函數發送到for循環的外部回調函數?

以下是沒有db的工作異步代碼示例。 問題是,如果我用db.collection.find()替換了變量(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中讀取數據,並把他們送回了回調到下一個 功能,需要從數據庫中的相關信息進行。

沒有mongodb讀取功能它工作完美,但現在我不知道如何 我可以將數據庫變量從兩個內部函數發送到第一個回調函數。

希望有人能幫助我... 感謝

VAR誤差= 0; var var1 =「yessir」;

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

回答

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循環將結束。如果你真的需要這個循環,你可以嘗試一個不錯的flow control librariesoutthere

+0

Thanx!我發佈了一個沒有db的工作代碼的例子。希望更好地理解。 OA – 2012-08-04 13:44:05

相關問題