如何从AngularJS的工厂调用工厂

如何从AngularJS的工厂调用工厂,angularjs,Angularjs,我找不到一个明确的答案,所以如果有,请提前道歉 (此plunker)显示我的代码的当前状态。有一个返回http查询的控制器: (function() { 'use strict'; angular .module('marketsApp') .controller('marketLocationController', marketLocationController); marketLocationController.$inject = ['$scope', '$routeParams',

我找不到一个明确的答案,所以如果有,请提前道歉

(此plunker)显示我的代码的当前状态。有一个返回http查询的控制器:

(function() {
'use strict';
angular
.module('marketsApp')
.controller('marketLocationController', marketLocationController);

marketLocationController.$inject = ['$scope', '$routeParams',    'marketLocationService'];

function marketLocationController($scope, $routeParams, marketLocationService) {
    $scope.center = {};
    $scope.markers = {};

    // console.log(geo.coords);

    activate ();

    function activate () {
        getMarketLocations();
    }

    function getMarketLocations() {
        var marketList = marketLocationService.getMarkets();
        $scope.marketList = marketList;
        // insert list template here
    }
}

})();
查询采用三个参数,即此工厂的位置:

(function() {
'use strict';
angular
.module('marketsApp')
.factory('BrowserLocation', BrowserLocation);

BrowserLocation.$inject = ['$q'];

function BrowserLocation() {

    return {
        getLocation: function () {
            var deferred = $q.defer();

            if (navigator.geolocation) {
                navigator.geolocation.getCurrentPosition(function (position) {
                    deferred.resolve(position);
                });
            }
            return deferred.promise;
        }
    };
}
})();
(function() {
'use strict';
angular
.module('marketsApp')
.factory('marketLocationService', marketLocationService);

marketLocationService.$inject = ['$http', '$q', 'BrowserLocation', 'userDefaultsService'];

function marketLocationService($http, $q, BrowserLocation, userDefaultsService) {

var apiUrl = "/api/markets/bylocation";

    return {
        getMarkets: getMarkets
    };

    function getMarkets () {

        // var self = this;
        var apiParams = {
            point: null,
            dist: null,
            limit: null
        };

        var thisLocation = null;
        var thisDefault = null;

        thisLocation = function (location) {
            BrowserLocation.getLocation()
        };

        thisDefault = function (defaults)   {
            userDefaultsService.getDefaults();
        };

        // extract the params here
        // (this is how it should work)
        // lat = thisLocation.coords.latitude;
        // lon = thisLocation.coords.longitude;
        // apiParams.point = lat + "," lon;
        // apiParams.dist = thisDefault.dist;
        // apiParams.limit = thisDefault.limit;

        $http({
            url: apiUrl,
            method: 'GET',
            params: {
                point: point,
                dist: dist,
                limit: limit
            }
        });
    }
}

})();
以及来自此工厂的两个参数,它们将是查询或最终从本地存储访问:

(function() {
'use strict';
angular
.module('marketsApp')
.factory('userDefaultsService', userDefaultsService);

userDefaultsService.$inject = ['$q'];

function userDefaultsService($q) {

    return {
      getDefaults: function () {
          var deferred = $q.defer();
          var userDefaults = {
              dist: 25,
              limit: 100
          };
        return deferred.promise;
        }
    };
}

})();
并且查询是在这个工厂中构造的:

(function() {
'use strict';
angular
.module('marketsApp')
.factory('BrowserLocation', BrowserLocation);

BrowserLocation.$inject = ['$q'];

function BrowserLocation() {

    return {
        getLocation: function () {
            var deferred = $q.defer();

            if (navigator.geolocation) {
                navigator.geolocation.getCurrentPosition(function (position) {
                    deferred.resolve(position);
                });
            }
            return deferred.promise;
        }
    };
}
})();
(function() {
'use strict';
angular
.module('marketsApp')
.factory('marketLocationService', marketLocationService);

marketLocationService.$inject = ['$http', '$q', 'BrowserLocation', 'userDefaultsService'];

function marketLocationService($http, $q, BrowserLocation, userDefaultsService) {

var apiUrl = "/api/markets/bylocation";

    return {
        getMarkets: getMarkets
    };

    function getMarkets () {

        // var self = this;
        var apiParams = {
            point: null,
            dist: null,
            limit: null
        };

        var thisLocation = null;
        var thisDefault = null;

        thisLocation = function (location) {
            BrowserLocation.getLocation()
        };

        thisDefault = function (defaults)   {
            userDefaultsService.getDefaults();
        };

        // extract the params here
        // (this is how it should work)
        // lat = thisLocation.coords.latitude;
        // lon = thisLocation.coords.longitude;
        // apiParams.point = lat + "," lon;
        // apiParams.dist = thisDefault.dist;
        // apiParams.limit = thisDefault.limit;

        $http({
            url: apiUrl,
            method: 'GET',
            params: {
                point: point,
                dist: dist,
                limit: limit
            }
        });
    }
}

})();

我无法让BrowserLocation和userDefaultsService返回它们的对象,以便将它们传递到apiParams中。我知道我可能必须使用$q或。然后确保两者都解决,但目前我似乎没有查询工厂的正确方法,因此我的问题是如何从另一个工厂查询工厂?

您可以使用
$q.all
等待多个承诺解决。在
marketLocationService
中等待
BrowserLocation.getLocation
userDefaultsService.getDefaults
。然后在解决这些问题后,执行
$http
请求:

$q.all([BrowserLocation.getLocation(), userDefaultsService.getDefaults()]).then(function(values) {
// here values[0] is response from getLocation
// values[1] is response from getDefaults
          $http({
            url: apiUrl,
            method: 'GET',
            params: {
                point: point,
                dist: dist,
                limit: limit
            }
        });
        });
您还需要解析
userDefaultsService.getDefaults
假设它应该是异步的:

return {
      getDefaults: function () {
          var deferred = $q.defer();
          var userDefaults = {
              dist: 25,
              limit: 100
          };
          $timeout(function() {
            deferred.resolve(userDefaults);
          })
        return deferred.promise;
        }
    };

请参见plunker

谢谢,它做得非常完美。