在 Angular 服务中使用 $http 和 $q 的正确方法?
Correct way to use $http and $q within Angular service?
我需要进行反向地理编码,并从 latitude/longitude 信息中获取城市名称。
我创建了一个 Angular 服务,它通过 $http 调用 Google 地图 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);
});
});
$http
本身已经 return 是一个承诺,所以你不必 return 你自己的:
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;
});
只要您遵守 return 承诺,您就可以用 .then
链接它们,一旦您 return 一个非承诺值,它将是 resolved/rejected。
我需要进行反向地理编码,并从 latitude/longitude 信息中获取城市名称。
我创建了一个 Angular 服务,它通过 $http 调用 Google 地图 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);
});
});
$http
本身已经 return 是一个承诺,所以你不必 return 你自己的:
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;
});
只要您遵守 return 承诺,您就可以用 .then
链接它们,一旦您 return 一个非承诺值,它将是 resolved/rejected。