2016-04-08 5 views
1

逆ジオコーディングを行い、緯度/経度情報から市の名前を取得する必要があります。

$ http経由でGoogle maps apiを呼び出すAngularサービスを作成しました。返されたデータから、私は都市の名前だけが必要です。 Angularサービス内の$ httpの非同期性に苦しんでいました。私がそれを稼働させることができる唯一の方法は、サービスで$ 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でそれらをチェーンすることができます約束を返す保つよう保証されていない値は解決/拒否されます。

関連する問題