2016-04-08 10 views
1

Ich muss eine umgekehrte Geocodierung durchführen und den Namen der Stadt aus der Breiten-/Längengradinformation erhalten.

Ich habe einen Angular-Dienst erstellt, der über $ http einen Aufruf an die Google Maps API aufruft. Von den zurückgegebenen Daten brauche ich nur den Namen der Stadt. Ich kämpfte mit der asynchronen Natur von $ http innerhalb des Angular Service. Der einzige Weg, wie ich es zum Laufen bringen konnte, war mein eigenes Versprechen mit $ q im Service zu erstellen.

Es funktioniert, aber ich bin mir nicht sicher, ob dies der richtige Weg ist, es zu tun. Jede Rückmeldung ist mehr als willkommen!

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

Antwort

2

$http selbst liefert bereits ein Versprechen, so dass Sie nicht zurückkehren müssen, um Ihre eigenen:

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

Solange Sie Rückkehr Versprechen halten Sie können ketten sie mit einem .then, wenn Sie zurückkommen ein nicht vielversprechender Wert wird aufgelöst/abgelehnt.

Verwandte Themen