2017-08-04 64 views
-1

完成我非常新的Node.js,这里是我的问题等待嵌套循环中的NodeJS

我有一个嵌套组映射在这里(我一直在使用的for-each也试过)。 嵌套的所有“get ...”方法都返回由我定义的承诺。我必须不断循环方法返回的数据,并使用它来调用下一个“get ..”方法(存在依赖关系)。完成整个嵌套循环后,“allobj”数组应该有我的最终结果,并且我试图在完成所有循环后返回它。到目前为止,我还没有运气,因为空数组被返回。

var allobj = new Array(); 
var catcount = 0; 

//categories.forEach(function(category){  
var p = categories.map(function(category,index,array){   
catcount++; 

return gettests(runid,category).then(function(tests){ 
//console.log(tests.sort().reverse());  //this is sync 

    //tests.forEach(function(test){ 
    var t = tests.map(function(test,index,array){ 

     return getmetriccategories(runid,category,test).then(function(data){ 
     //console.log(data); 

     //data.forEach(function(mc){ 
     var d = data.map(function(mc,index,array){ 

      return getmetrics(runid,category,test,mc).then(function(data1){ 

       var x = data1.map(function(metric,index,array){ 
          allobj.push(metric); 
          return metric; 
         }); 
        }); 
       }); 
      }) 
     }) 
    }) 
}) 

//return when all nested loops are done  
res.send(allobj);  
+0

这里有数百个这类问题已经在堆栈溢出的地方回答了。在堆栈溢出中搜索“promise loop”,你会发现很多相关的答案。既然你已经在使用promise,你需要收集你在循环中创建的所有promise,并返回Promise.all(allYourPromises)'。这就是你如何得到父母的承诺,直到所有的孩子的承诺完成才能解决。 – jfriend00

+0

下面是一个示例:[等待For循环中的承诺](https://stackoverflow.com/questions/32081677/wait-for-promises-from-a-for-loop/32085526#32085526)。 – jfriend00

回答

0

你的功能getmetriccategoriesgetmetrics返回承诺,至少,它们的返回值似乎有一个then方法这对于一个指标。这意味着,它们异步工作。所以,map调用不直接返回结果,而是一组Promise。等待所有这些承诺必须履行的(这意味着,异步函数完成),您可以使用Promise.all功能:

Promise.all(data.map(...)) 
    .then(function (result) { 
     res.send(result) 
    }) 

正如你看到的,Promise.all返回一个新的承诺,所以你可以使用then来收到结果并发送给res.send