2016-03-31 4 views
0

私はAngularファクトリに少し問題があります。それは正確にデータを返す しかし、私はそれをログにしようとすると、クロムコンソールでは、それは最初は空であり、クロムは私のオブジェクトの横にメッセージを表示します - object value at left was snapshotted when logged。私のオブジェクトを展開すると、すべてがそこにあります。返されたデータをループすると、定義されていないエラーが発生します。角度のあるファクトリからデータを返すと、オブジェクトが返された後にデータが設定されます。

私はこれが約束されていると確信していますが、どうすればいいか分かりません。私はちょうど私のコントローラでこの工場から返されたデータをループスルーしたいと思っています。私のコードは以下の通りです。

angular.module('myMap').factory('mapSorter', function($http) { 
     x2js = new X2JS(), 
     data = { 
     styles: [], 
     layers: [] 
     }; 
     return { 
     //pass in array of objects with url property 
     processMapData : function(kmls) { 
     //loop through each object 
      angular.forEach(kmls, function(kml) { 
      $http.get(kml.url).then(function(response) { 
       //push properties from response into data object 
       data.styles = data.styles.concat(x2js.xml_str2json(response.data).kml.Document.Style) 
       data.layers.push(x2js.xml_str2json(response.data).kml.Document.Placemark) 
      }) 
      }) 
      return(data); 
     } 
    } 
    }); 

ありがとうございます!

+1

あなたのデータはどこですか? $ http.getリクエストは非同期なので、データを返す前にデータが到着するのを待ってから、コンソールに出力してください。 –

+0

応答をありがとう。私はコントローラでこれをやっています: 'mapData = mapSorter.processMapData($ scope.kmlLayers); console.log(mapData) ' ここで($ scope.kmlLayers)は、私がprocessMapData関数に渡しているオブジェクトです。 –

+0

私は、工場から返される前か、コントローラからオブジェクトが受け取られた後に、すべてのデータがいつ返されるかを把握する方法が必要だと思います。 –

答えて

1

$q.allをご覧ください。それは一連の約束を受け入れ、すべての約束が解決したら解決するでしょう。あなたはこのような何かを行うことができるでしょう:

$q.all([promise1, promise2, promise3]).then(function(values){ 
    console.log(values[0]) // promise1 value 
    console.log(values[1]) // promise2 value 
    console.log(values[2]) // promise3 value 
}); 

あなたがしなければならないだろうすべてが配列にそれぞれの約束を押し、次に$q.all(array)を返しています。コントローラ内でthenに電話して、すべての回答を得ることができます。

うまくいけば、これは役に立ちます

+0

こんにちは@maddockst、応答に感謝します。これは多くの助けと私は近いと思う。私のデータの一部が返されていますが、一部は返されません。私はそれが私のコードが構造化されている方法だと思う、あなたが私を助けることができるチャンス?私は問題の領域をコメントしました。 http://pastebin.com/cQfU32wHありがとう:) –

+1

私が見る限り、あなたは戻ります/コンソールは '$ q.all()'の外にあり、オブジェクトの構築が完了していない可能性がありますただまだ。しかし、 '$ q.all()'の中にデータを返すと、新しい約束ができます。したがって、 '$ q.all()'を返すと、あなたのコントローラに、あなたのデータオブジェクトをコールバックに渡す 'processMapData'で' then'を呼び出すことができます。これは理にかなっていますか? – maddockst

+0

私はそのトリックをしたと思います。私は今コントローラのすべてのデータを取得しています、ありがとう:) –

関連する問題