2016-03-11 6 views
0

Я пытаюсь перебрать массив объектов (сообщений). Внутри цикла находится запрос к базе данных geofire (gf.get()). Он извлекает местоположение gps определенного ключа. Затем данные переносятся в массив.Итерация через массив объектов с использованием геофир и firebase

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

тот же ключ и титул снова и снова, что не является представителем плюсов данных " сообщений "(ключ и названия уникальны).

Я считаю, что моя проблема связана с плохим пониманием асинхронного вызова, обещаний и т.д.

Любая помощь будет оценена.

ответ

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, чтобы сохранить «создать пустой массив, а затем добавьте «часть.

+0

Спасибо! Я пробовал код, но я все еще получаю ту же проблему. Если я console.log (post.title) после «var p = gf.get (key) .then (function (location) {», я все равно получаю повторяющиеся данные. –

+0

Конечно, см. Мой ответ в http: // stackoverflow .com/a/30180679/1348195 –

+0

Спасибо за помощь! Я прочитал ваш ответ, но мне все еще сложно понять это. Функция get (key) возвращает обещание. Я понимаю, что «get» должен закончите раньше. Затем запускается. Поэтому у меня не должно быть проблем с повторяющимися данными. –