2017-05-26 69 views
-2

這是我的問題:我有一個數據庫,用2個集,以簡化他們看起來像這樣:的NodeJS多個異步調用

var classes = { 
    class:Number, 
    students:[Number] } 
    var student = { 
    id:Number, 
    name:String } 

我也有收到
有關類的一些數據的路由(例如學年,班級等),並要求班級模型返回學生姓名。我有一個簡單的時間選擇所需的學生數組,但在我的班級模型中,我無法找到一個詢問學生模型名稱的好方法。我在做這樣的事情在類模型:

mod.exports = function(someDataToRetriveClass,callback){ 
    var counter =0;  
    var studData = []; 
    Classes.getStudList(function(err,res){ 
     for(var i=0;i<res.length;i++){ 
      getStudData(res[i],function(err,res2){ 
       counter +=1; 
       studData.push(res2); 
       if(counter >= res.length){callback(studData)} 

      }) 
    }}) 
} 

這是做事的醜陋的方式,有沒有得到同樣結果的一些更簡潔的方法嗎?
Ps:即時通訊使用mongodb和mongoose作爲數據庫支持。

+1

承諾:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise – zurfyx

+0

@zurfyx但是我將如何解決這個事實,即我不知道要創建多少個承諾。我的意思是,如果我知道res.length是固定的我可以這樣做:Promise = getStudData.than(getStudData.than(getStudData等,但在這種情況下,我不知道有多少承諾創建。 –

回答

0

您應該考慮使用承諾並使用promise.all等待您需要在單個doneresolve函數中完成的多個並行操作。

從藍鳥承諾的例子更容易理解(IMHO)比Mozilla和如下:

var files = []; 
for (var i = 0; i < 100; ++i) { 
    files.push(fs.writeFileAsync("file-" + i + ".txt", "", "utf-8")); 
} 
Promise.all(files).then(function() { 
    console.log("all the files were created"); 
}); 
+0

非常感謝這個例子 –