我需要进行反向地理编码,并从纬度/经度信息中获取城市名称。
我创建了一个Angular服务,通过$ http调用Google maps api。从返回的数据中我只需要城市的名称。我正在努力解决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);
});
});
答案 0 :(得分: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
链接它们,一旦您返回非承诺值,它将被解析/拒绝。