使用另一个工厂中一个工厂的异步数据

时间:2016-06-14 14:25:57

标签: javascript angularjs angularjs-scope angular-promise

我正在尝试使用另一家工厂中角度来自一家工厂的地理位置数据来查询天气API以获取数据。我无法弄清楚如何在两个工厂之间共享lat / lng变量,我知道你已经使用了$ scope但我无法让angular-promise正常工作。目前存在静态lat / lng变量。控制器中的locate函数甚至不打印到控制台,我认为我的promise函数有问题。

以下是工厂:

'use strict';

app.config(['$resourceProvider', function ($resourceProvider) {

    $resourceProvider.defaults.stripTrailingSlashes = false;

}]);

app.factory("geolocationService", ['$q', '$window', '$rootScope', function ($q, $window, $rootScope) {
    return {
        currentLocation: function() {var deferred = $q.defer();

            if (!$window.navigator) {
                $rootScope.$apply(function() {
                    deferred.reject(new Error("Geolocation is not supported"));
                });
            } else {
                $window.navigator.geolocation.getCurrentPosition(function (position) {
                    $rootScope.$apply(function() {
                        deferred.resolve(position);
                        var geoJ = $scope.data;
                        //console.log(position);
                    });
                }, function (error) {
                    $rootScope.$apply(function() {
                        deferred.reject(error);
                    });
                });
            }
            return deferred.promise;
        }
    }
}]);

app.factory('weatherFactory', ['$http','geolocationService', function ($http, $scope, geolocationService) {
    //var currentLocation = geolocationService.currentLocation();
    var apiKey = 'd079ba76e47f06f2ea3483892f1b1d40';


    var lat = '40',
    lon = '-79';
    return {
        currentForecast: function(callback){
            var url = ['https://api.forecast.io/forecast/', apiKey, '/', lat, ',', lon, '?callback=JSON_CALLBACK'].join('');

            $http.jsonp(url)
            .success(function (data){
                callback(null, data);
                //console.log("weatherFactory API Call: ");
                //console.log(data);
            })
            .error(function (error) {
                callback(error);
            });
        }
    };
}]);

这是控制器

app.controller('weatherCtrl', function ($scope, $window, weatherFactory, geolocationService) {
    //console.log(geolocationService.currentLocation());
    //var location = geolocationService.currentLocation();
    //console.log("location object: ");
    //console.log(location);
    var locate = function(){
        geolocationService.currentLocation().then(function(location){
            $scope.location = location;
            console.log($scope.location);
        });
    };
    var pollForecast = function pollForecast() {
            var commutes = calculateNextCommutes();
            weatherFactory.currentForecast(function (err, data) {
                if (err) {
                    $scope.forecastError = err;
                } else {
                    $scope.forecast = data;
                    $scope.nextCommute = findCommuteWeather(commutes.nextCommute, $scope.forecast.hourly.data);
                    $scope.nextNextCommute = findCommuteWeather(commutes.nextNextCommute, $scope.forecast.hourly.data);
                }
            });
        };

    $scope.init = function () {
        pollForecast();
        setInterval(function () {
            console.log('polling weather every hour')
            pollForecast();
        }, 1000 * 60 * 60);    //poll every hour
    }
});

我是Angular的新手,非常感谢社区的帮助,我想在这里更加活跃!提前谢谢。

最诚挚的问候,

-MC

2 个答案:

答案 0 :(得分:0)

首先,不要在工厂使用$ SCOPE ,$ scope仅适用于控制器。

解决问题的方法非常简单。让weatherFactory通过返回它们来公开lat / long:

return {
       lat: lat,
       lon: lon,
        currentForecast: function(callback){
            var url = ['https://api.forecast.io/forecast/', apiKey, '/', lat, ',', lon, '?callback=JSON_CALLBACK'].join('');

            $http.jsonp(url)
            .success(function (data){
                callback(null, data);
                //console.log("weatherFactory API Call: ");
                //console.log(data);
            })
            .error(function (error) {
                callback(error);
            });
        }
    };

然后,将weatherFactory注入geolocationService,您就可以访问lat / lon:

app.factory("geolocationService", ['$q', '$window', '$rootScope', 'weatherFactory', function ($q, $window, $rootScope , weatherFactory) {
    return {
        currentLocation: function() {var deferred = $q.defer();
            var lat = weatherFactory.lat;
            var lon = weatherFactory.lon;
            if (!$window.navigator) {
                $rootScope.$apply(function() {
                    deferred.reject(new Error("Geolocation is not supported"));
                });
            } else {
                $window.navigator.geolocation.getCurrentPosition(function (position) {
                    $rootScope.$apply(function() {
                        deferred.resolve(position);
                        var geoJ = $scope.data;
                        //console.log(position);
                    });
                }, function (error) {
                    $rootScope.$apply(function() {
                        deferred.reject(error);
                    });
                });
            }
            return deferred.promise;
        }
    }
}]);

答案 1 :(得分:0)

这个怎么样:

/modules/commonjs/modulename/version/module.js