2016-04-08 4 views
1

Мне нужно сделать обратное геокодирование и получить название города по широте/долготе информации.

Я создал услугу «Угловая», которая звонит в карты Google api через $ http. Из возвращаемых данных мне нужно только название города. Я боролся с асинхронным характером $ http в службе Angular. Единственный способ, которым я мог его запустить, - это создать свое собственное обещание с помощью $ q в сервисе.

Это работает, но я не уверен, что это правильный способ сделать это. Любая обратная связь более чем приветствуется!

var app = angular.module('devApp', []); 

app.factory('reverseGeoCoder', function($http, $q) { 
    var service = { 
     getAddress: function(lat, lng) { 
      var url = 'https://maps.googleapis.com/maps/api/geocode/json?latlng=' + lat + ',' +lng; 
      var deferred = $q.defer(); 

      $http.get(url).then(function(data) { 
       // extract the address and return it to the caller 
       deferred.resolve(data.data.results[0].formatted_address); 
      }, function(reason) { 
       deferred.reject(reason); 
      }); 
      return deferred.promise; 
     } 
    }; 
    return service; 
}); 

app.controller('mainController', function(reverseGeoCoder) { 
    var vm = this; 
    reverseGeoCoder.getAddress(47.353166, 8.558387).then(function(data) { 
      vm.address = data; 
     }, function(reason) { 
      console.log('reverse geocoding failed, reason: ' + reason); 
    }); 
}); 

ответ

2

$http сами уже возвращает обещание, так что вам не придется возвращать свой собственный:

app.factory('reverseGeoCoder', function($http, $q) { 
    var service = { 
     getAddress: function(lat, lng) { 
      var url = 'https://maps.googleapis.com/maps/api/geocode/json?latlng=' + lat + ',' +lng; 

      return $http.get(url).then(function(data) { 
       // extract the address and return it to the caller 
       return data.data.results[0].formatted_address; 
      }, function(reason) { 
       return reason; 
      }); 
     } 
    }; 
    return service; 
}); 

Пока вы держите возвращающиеся обещания, которые вы можете приковать их с .then, когда вы вернетесь значение без обещания будет разрешено/отклонено.