2017-08-04 2 views
-1

を完了するために、私はNode.jsのに非常に新しいです待って、ここに私の問題は私は(私ものために、それぞれ使用して試してみました)ここでマップのネストされたセットを持っているネストされたループがnodejsで

です。 ネストされたすべての "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.all(allYourPromises)を返す '必要があります。それはあなたが子供の約束がすべて終わるまで解決しないという親の約束を得る方法です。 – jfriend00

+0

ここでは、[For Loopsからの約束待ち](https://stackoverflow.com/questions/32081677/wait-for-promises-from-a-for-loop/32085526#32085526)の例を示します。 – jfriend00

答えて

0

あなたの機能getmetriccategoriesgetmetricsリターンの約束は、少なくとも、その戻り値は、そのための指標であるthen方法を持っているようです。つまり、これらは非同期で動作します。したがって、map呼び出しは結果を直接返しませんが、Promisesの配列を返します。 (非同期機能が完了し、意味する)成就するこれらの約束のすべてを待つために、あなたはPromise.all機能を使用することができます:あなたが見たよう

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

を、あなたにthenを使用できるようにPromise.allは、新しい約束を返します。結果を受け取り、res.sendで送信してください。

関連する問題