在Angular服务中使用$ http和$ q的正确方法?

时间:2016-04-08 13:58:24

标签: javascript angularjs angular-services

我需要进行反向地理编码,并从纬度/经度信息中获取城市名称。

我创建了一个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);
    });
});

1 个答案:

答案 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链接它们,一旦您返回非承诺值,它将被解析/拒绝。