2016-03-31 49 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

我认为这是伎俩。我现在得到了我的控制器中的所有数据,谢谢:) –