Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获得';未定义';在控制器中使用我的工厂时出错_Javascript_Angularjs_Controllers_Factories - Fatal编程技术网

Javascript 获得';未定义';在控制器中使用我的工厂时出错

Javascript 获得';未定义';在控制器中使用我的工厂时出错,javascript,angularjs,controllers,factories,Javascript,Angularjs,Controllers,Factories,嘿,伙计们,我正在开发一个新的应用程序,但我遇到了一个路障。我的工厂本身运行良好,但当我尝试在控制器中使用它时,我得到: Error: getPlaces.getPlaces(...) is undefined 下面是我工厂的代码: angular.module('Space') .factory('getPlaces', ['$http', function($http) { var placesFactory = {}; placesFactory.getPlaces =

嘿,伙计们,我正在开发一个新的应用程序,但我遇到了一个路障。我的工厂本身运行良好,但当我尝试在控制器中使用它时,我得到:

Error: getPlaces.getPlaces(...) is undefined
下面是我工厂的代码:

angular.module('Space')
.factory('getPlaces', ['$http', function($http) {
    var placesFactory = {};

    placesFactory.getPlaces = function() {


        if (navigator.geolocation) {
            var geoLoc = navigator.geolocation;
            return geoLoc.getCurrentPosition(function(position) {
                var lat = position.coords.latitude,
                    lng = position.coords.longitude;

            return getFSinfo(lat, lng);
        });

        } else {
            alert('Opps. Looks like you have your location turned off. Space uses your location to find places near you.');
        }


        function getFSinfo (lat, lng) {
            var clientID = 'J2HCJIGLTSFFJMKMLAEBT30QNLINBSDQBBDZNRRH1MUSDZ4V',
                clientSercet = 'RJBO0O01D2OSPR5R2KF4S214CFNXAOAD03DJM3L15ERLUCXF',
                coords = lat + ',' + lng,
                searchIds = '';

                var categoryIds = {
                    movie: '4bf58dd8d48988d17f941735',
                    museum: '4bf58dd8d48988d181941735',
                    stadium: '4bf58dd8d48988d184941735',
                    themePark: '4bf58dd8d48988d182941735',
                    waterPark: '4bf58dd8d48988d193941735',
                    eventVenue: '4d4b7105d754a06373d81259',
                    food: '4d4b7105d754a06374d81259',
                    mall: '4bf58dd8d48988d1fd941735',
                    musicStore: '4bf58dd8d48988d1fe941735',
                    foodDrink: '4bf58dd8d48988d1f9941735',
                    clothesStore: '4bf58dd8d48988d103951735'

                };


                for (var key in categoryIds) {
                    searchIds += categoryIds[key] + ',';
                }

                var FSUrl = 'https://api.foursquare.com/v2/venues/search?ll=' + coords + '&client_id=' + clientID + '&client_secret=' + 
                clientSercet +'&intent=browse&radius=20000' + '&categoryId=' + searchIds + '&v=20130815' + '&limit=50';


                return $http.get(FSUrl)
                    .then(function(response) {

                        var data = response.data.response;
                        console.log(data);
                        return data;

                    }, function(error) {
                        console.log(error);
                    }); 
        }



};



        return placesFactory;
}]);
控制器:

angular.module('Space')
.controller('MainCtrl', ['getPlaces', '$http', function(getPlaces, $http) {
    var vm = this;
    vm.message = 'Hello world!';

    getPlaces.getPlaces().then(function(data) {
        vm.place = data;
        console.log(vm.place);
    });

}]);
我不明白你为什么这么想


任何帮助都会很好

您的控制器希望
getPlaces()
返回承诺<代码>getCurrentPosition()不返回任何内容。您可以像这样创建自己的承诺:

if (navigator.geolocation) {
    var geoLoc = navigator.geolocation;
    return $q(function(resolve) {
        geoLoc.getCurrentPosition(function(position) {
            var lat = position.coords.latitude,
                lng = position.coords.longitude;

            resolve(getFSinfo(lat, lng));
        });
    });
}

确保向工厂注入$q。最后,要像我一样使用$q,您需要Angular 1.3+。如果您使用的是早期版本,您可以使用完成相同的任务。

请发布您的控制器代码。很抱歉,已发布!非常感谢,伙计,成功了!但是我很困惑,我想当我在getFSinfo函数中返回$http.get()请求时,它本身就是在返回一个承诺,这样我就可以将then()方法链接起来?有什么资源可以帮助我更好地理解这一点吗?谢谢是的,
getFSinfo
确实返回了一个承诺。但是在原始的
getPlaces
代码中,您返回了
geoLoc.getCurrentPosition()
的结果,该结果始终未定义。你的压痕可能会掩盖这个事实。在我发布的代码中,本质上你是在从
getFSinfo
返回承诺。所以在我的原始代码中
geoLoc.getCurrentPosition()
从未实际返回getFSinfo?还有,我读过什么书来帮助我更好地理解它吗?很抱歉,关于链接的所有问题,但只是为了让我更好地理解
geoLoc.getCurrentPosition()
从不返回getFSinfo()?正确
geoLoc.getCurrentPosition()
不返回任何内容。因为您传递的回调函数是异步调用的,所以它返回的任何内容实际上都不会出现在您的代码中的任何地方。