0

请看一下我的代码。

  var posts = PostsData.getPosts();   
  var postFunc = function(key) {
      return posts[key];  
  }

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

    for (var key in posts) {

          console.log(key);
          var p = gf.get(key).then(function(location) { 
          var post = postFunc(key);
          console.log(key);
          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;
    });

  });
})

}

在循环中有两行“console.log(key)”。第一个 console.log 打印出作为唯一键的数据的准确表示。第二个 console.log 打印重复的相同数据,这是不准确的。我无法理解为什么会这样。

非常感谢帮忙。

4

2 回答 2

0

另一种解决问题的技术是使用 IIFE 闭包。

var markers = [];

for (var key in posts) {
    //IIFE closure
    (function (key) {
        console.log(key);
        var p = gf.get(key).then(function(location) { 
            var post = postFunc(key);
            console.log(key);
            return ({
                idKey: key,
                title: post.title,
                coords: {
                    latitude: location[0],
                    longitude: location[1]
                }
            });
        });
        markers.push(p);
    })(key);
}

通过使用 IIFE(立即调用函数表达式),每个值都会key保留,直到.then方法内的函数完成。

于 2016-04-02T04:31:39.817 回答
0

console.log(key)从第二个开始你有相同的价值是很正常的。原因是你的 async function gf.get(key).then(function(location) { .. }。到调用此函数时,您的循环已完成执行,并且 的值key是循环中的最后一个值。我不知道该怎么gf.get做,但如果posts是一个数组,你可以在递归的帮助下实现你的结果,如下所示

var posts = PostsData.getPosts();   
var postFunc = function(key) {
    return posts[key];  
}

var markers = [];
var getMarkers(key) {

    if (key > posts.length - 1) {

        // promise resolved for each item in posts
        $q.all(markers).then(function(markers) {
            $scope.markers = markers;
        }

        return;
    }

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

        getMarkers(++key);
    });
}

$scope.$watch($scope.active, function() {
    markers = [];
    getMarkers(0);
});

注意:在这种方法中,我们等待每个承诺得到解决,然后再进行下一次调用gf.get

于 2016-04-01T21:10:19.187 回答