2016-11-16 60 views
0

我在MongoDB中使用listCollection方法,並使用find查詢每個返回的集合。在循環中嵌套異步數據庫調用,等到循環完成

的問題是,我使用循環來構建祝循環完成後response.json返回一個對象,但因爲find是異步我停留在盤算如何「等待」,直到每find回調之前完成返回response.json()

var data = {}; 

database.listCollections({name: {$ne: 'system.indexes'}}).toArray(function(err, collections) { 
    if (err) return res.json({}); 

    for(i=0; i<collections.length; i++){ 
     var collection = collections[i].name; 

     database.collection(collection).find(query, limit) 
     .sort({"Date": -1}).toArray(function(err, docs){ 

      if (err) return res.json({ 
      }); 

       /* Do stuff with docs, push stuff to data */ 
     }); 
     /** Console shows blank **/ 
     console.log("Data " + i+ ": " + JSON.stringify(data)); 
    } 
    /** Response is blank.. **/ 
    res.json(data); 
}); 

的問題是,find() s的完成前的for循環返回方式。如何以JS/Node的方式處理此問題?我可以一起解決一個解決方案,但我可能以後遇到類似的問題..

編輯:我確定數據實際上返回並正確處理,因爲每個數據查找內的console.log()顯示它實際上有內容。

回答

1

如果您的NodeJS版本支持它,或者使用任何Promise庫,則可以使用Promise。在這種情況下,您可以將for循環中的代碼包裝到某個返回Promise的函數中,然後將所有這些promise對象都推送到數組中。循環調用後

Promise.all(promisesArray).then(/* Callback function that sends response */)

另一種選擇是使用遞歸代替for循環的,當你達到停止條件發送請求。但我認爲這不是好的選擇,因爲如果collections數組很大,則可以超過最大堆棧大小。