0

我正在尝试遍历一组对象(帖子)。在循环中是对 geofire 数据库 (gf.get()) 的查询。它检索某个键的 gps 位置。然后将数据推送到数组。

  var posts = PostsData.getPosts();      

  $scope.$watch($scope.active, function() {
      $timeout(function() {
    var markers = [];

    for (var key in posts) {
      var post = posts[key];
      if (posts.hasOwnProperty(key) && posts[key]!=null) {
        gf.get(key).then(function(location) { 
        console.log(post.title);
        console.log(key);
        markers.push({
          idKey: key,
          title: post.title,
          coords: {
            latitude: location[0],
            longitude: location[1]
          }
         })
      })
    $scope.markers = markers;
     }
  }
})

})

以下代码的输出......

        console.log(post.title);
        console.log(key);

一遍又一遍是同一个key和title,不代表“posts”中的数据(key和title是唯一的)。

我相信我的问题是由于对异步调用、承诺等缺乏了解。

任何帮助将非常感激。

4

1 回答 1

0

这是因为您在$scope.markers = markers;执行所有调用之前。您需要致电$q.all以等待所有承诺:

var p = gf.get(key).then(function(location) { 
    return ({
      idKey: key,
      title: post.title,
      coords: {
        latitude: location[0],
        longitude: location[1]
      }
     });
});
markers.push(p);

然后,等待所有请求并执行您的添加:

$q.all(markers).then(function(markers) {
     $scope.markers = markers;
});

您可以使用Array.prototype.map保存“创建空数组然后添加”部分。

于 2016-03-11T21:10:49.573 回答