2015-10-20 51 views
4

我是新來的貓鼬。 這裏是我的情況:如何保存從貓鼬query.exec()函數返回的對象

var childSchema = new Schema({ name: 'string' }); 
var parentSchema = new Schema({ 
children: [childSchema]}); 
var Parent = mongoose.model('Parent', parentSchema); 

說我已經創建了有孩子的父母「P」,而我查詢「P」,利用

var query = Parent.find({"_id":"562676a04787a98217d1c81e"}); 
query.select('children');         
query.exec(function(err,person){        
    if(err){              
     return console.error(err);        
    } else {              
     console.log(person);          
    } 
});              

我需要訪問外部人員對象異步功能。任何想法如何做到這一點?

回答

5

貓鼬的find()方法是asynchronous這意味着你應該使用一個回調,你可以從find()方法包裹查詢。例如,你的情況,你可以定義一個回調的

function getChildrenQuery(parentId, callback){ 
    Parent.find({"_id": parentId}, "children", function(err, docs){ 
     if (err) { 
      callback(err, null); 
     } else { 
      callback(null, docs); 
     } 
    }); 
} 

然後你可以這樣調用:

var id = "562676a04787a98217d1c81e"; 
getChildrenQuery(id, function(err, children) { 
    if (err) console.log(err); 

    // do something with children 
    children.forEach(function(child){ 
     console.log(child.name); 
    }); 
}); 

你可以採取另一種方法是,承諾在exec()方法返回Promise,這樣你就可以做到以下幾點:

function getChildrenPromise(parentId){ 
    var promise = Parent.find({_id: parentId}).select("children").exec(); 
    return promise; 
} 

然後,當你想獲得的數據,你應該讓異步:

var promise = getChildrenPromise("562676a04787a98217d1c81e"); 
promise.then(function(children){ 
    children.forEach(function(child){ 
     console.log(child.name); 
    }); 
}).error(function(error){ 
    console.log(error); 
}); 
+1

非常感謝(y) – kumarD

0

你不能訪問它回調的外部(=「異步函數」你提到)。這就是node.js的工作原理:

  • 您對數據庫的調用需要一些時間 - 比較它只是執行簡單的代碼語句很長時間。
  • Node.js是非阻塞的,因此它不會等待數據庫返回結果,並且它將通過在query.exec語句後執行代碼而立即繼續。
  • 因此,您在執行query.exec語句之後編寫的代碼在數據庫返回結果之前運行,因此不可能在那裏使用該結果。

但是...懷抱異步編程:

  • 只寫你需要進入「異步函數」
  • 代碼傳遞一個回調到您的功能,從「異步函數調用它「並通過它查詢結果
+1

非常感謝:) – kumarD