在 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。