2013-03-10 41 views
0

我遇到了一個有線問題,當我使用mongodb存儲數據時,有些數據丟失了,我認爲這是因爲它異步功能在node.js中,如何使用node.js和mongodb在多個級別存儲數據

所以對於這份名單的時間表,我會用重

/*這裏是一個應用程序,其中通過使用train_uid今天, */

var today = new Date(); 
var day = today.getDay(); 
scheduleModel.findByTrainAndTime(train_uid,today,function(err, doc){ 
    var a = new Object(); 
    if(err){} 
    else{ 
     if(doc != null) 
     { 

// mongodb數據庫可以給我一些關於train_id的數據,uid

 a.train_uid = doc.train_uid; 
     a.train_id = train_id; 

,最重要的一個列車時刻表時間表,列車時刻表時間表就像進場,離場和tiploc JSON對象的列表(doc.time_schedule)。但是,我需要將tiploc更改爲sanox號碼,該referenceModel可以通過提供tiploc號碼來幫助查找sanox。

    //doc.time_schedule 
        // here is to add a array 

所以我用異步,列表中的每個項目,我用referenceModel查詢sanox和構建陣列 - a.timeline存儲每個B,最後當每個異步操作完成,trainModel是用一個sanox對象數組存儲一個對象。然而,當涉及到MongoDB的數據庫,只有sanox對象數組是空的,我想這是因爲異步操作的,但因爲我使用異步,爲什麼它不工作

    a.train_uid = doc.train_uid; //works 
     a.train_id = train_id; works 
        a.timeline = [] // doesn't work  
     a.timeline = new Array();            
     var b ; 
      async.forEachSeries(doc.time_schedule, 
       function(item,callback){ 
        referenceModel.findStanoxByTicloc(item.tiploc_code,function(err,sanox){ 
         try{ 
         b = new Object(); 
              b.sanox = sanox; 
         a.time.push(b); 

         }catch(err2){ 

         } 
        }); 
        callback(); 
       }, 
       function(err){ 
       trainModel.createNewTrain(a,function(){}); 

     } 
    } 
}); 
+0

你究竟在哪裏寫東西到mongo?我沒有看到它 - 我甚至不知道你從Mongo獲取數據的位置以及你將它寫回的位置。您是否可以在上面或下面包含完整的代碼和評論 - 很難閱讀您擁有它的方式。 – 2013-03-10 20:27:02

+0

scheduleModel.findByTrainAndTime,referenceModel.findStanoxByTicloc和trainModel.createNewTrain – user824624 2013-03-10 22:31:12

回答

0

你打電話callback在您啓動異步find之後,但在它實際回來之前。您需要等到您獲得數據後才能這樣做。以下應該更好地工作:

async.forEachSeries(doc.time_schedule, 
      function(item,callback){ 
      referenceModel.findStanoxByTicloc(item.tiploc_code,function(err,sanox){ 
        try{ 
        b = new Object(); 
        b.sanox = sanox; 
        a.time.push(b); 

        }catch(err2){ 

        } 
        callback(); 
       }); 
      }, 
      function(err){ 
      trainModel.createNewTrain(a,function(){}); 

    } 
+0

我認爲它應該以這種方式工作,但只要referenceModel在doc.time_schedule數組中找到第一個或第二個元素的結果,這意味着當forEachSeries不是完成後代碼將跳轉到traimModel.createNewTrain(a,function()){}。我非常困惑,異步編程對我來說很麻煩 – user824624 2013-03-11 14:11:57

相關問題