2017-08-04 136 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