2017-05-26 62 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

非常感谢这个例子 –