Angularjs 在循环中使用承诺

Angularjs 在循环中使用承诺,angularjs,firebase,promise,angular-promise,geofire,Angularjs,Firebase,Promise,Angular Promise,Geofire,我在重复循环中的数据时遇到问题(这是不准确的,数据应该是唯一的)。我认为问题是由于对承诺的执行/理解不力 var posts = PostsData.getPosts(); $scope.$watch($scope.active, function() { $timeout(function() { var markers = []; for (var key in posts) { var post = posts

我在重复循环中的数据时遇到问题(这是不准确的,数据应该是唯一的)。我认为问题是由于对承诺的执行/理解不力

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

                    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;
        });

    });
})

}
$scope.markers由重复的post.title数据填充。任何帮助都将不胜感激。我是编程新手,如果我的问题看起来很简单,我道歉

尝试替换:

var p = $q.defer();
p = gf.get(key).then(function(location) {
   ...
})

使用
p=gf.get(键)

。然后
返回一个承诺,因此
p
是一个承诺。@jib,
p
不是承诺
p.promise
是一个承诺,并且
。那么
不会返回任何内容。请参阅
。然后
返回承诺是我们如何做出承诺的。@jib,你说得对。对不起,
$q.defer()在那里没有意义。您应该使用
var p=gf.get(…)初始化。然后(…)
另外,如果
posts
是一个数组,请查看。改为使用,这也解决了您的其他问题。