2016-03-31 52 views
0

我對Angular工廠有點麻煩。它正確地返回數據 但在Chrome控制檯中,當我嘗試記錄它時,它最初爲空,而且chrome在我的對象旁邊顯示一條消息 - 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

你在哪裏console.log'在你的數據? $ 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

據我所知,你是return/console在'$ q.all()'之外,因此,可能還沒有完成構建你的對象只是還沒有。但是,您將在'$ q.all()'中返回數據,這將爲您創建一個新的承諾。所以,如果你返回'$ q.all()'然後在你的控制器中,你可以在'processMapData'上調用'then',這會讓你的數據對象傳入你的回調函數。這有意義嗎? – maddockst

+0

我認爲這是伎倆。我現在得到了我的控制器中的所有數據,謝謝:) –