Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.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 angular.run()方法中的异步函数尚未在控制器之前执行_Javascript_Angularjs_Asynchronous_Service_Controller - Fatal编程技术网

Javascript angular.run()方法中的异步函数尚未在控制器之前执行

Javascript angular.run()方法中的异步函数尚未在控制器之前执行,javascript,angularjs,asynchronous,service,controller,Javascript,Angularjs,Asynchronous,Service,Controller,目前我一直在玩angular,我发现很难找到解决方法。问题是我在app.run()上运行了一个$http方法$http方法从服务器获取rooms并在$rootScope.rooms变量中初始化它。在控制器中,我使用了这个rooms变量。因为$http方法是异步的,而且有时由于在方法完成之前加载了控制器,所以它会变为null。我正试图用另一种方式来处理它 game.js 由于rooms变量也将在其他文件中使用,所以我可能不想在每个控制器中放入$http方法,除非没有其他方法。如果我能使用angul

目前我一直在玩angular,我发现很难找到解决方法。问题是我在app.run()上运行了一个$http方法$http方法从服务器获取rooms并在$rootScope.rooms变量中初始化它。在控制器中,我使用了这个rooms变量。因为$http方法是异步的,而且有时由于在方法完成之前加载了控制器,所以它会变为null。我正试图用另一种方式来处理它

game.js
由于rooms变量也将在其他文件中使用,所以我可能不想在每个控制器中放入$http方法,除非没有其他方法。如果我能使用angularJs的服务那就太好了,这是angularJs的正常行为,因为每个REST调用都是异步的。如果您希望它更易于管理或以同步方式运行,则必须使用“promise”(angularJs中的$q服务)。请查找代码片段

服务代码:(您要使用的)

控制器代码:(呼叫服务)


我已经更新了我的答案。将调用showAll()放在控制器主体的开头。根据您的问题,我假设您希望在初始化时加载一些数据。这种方法将得到相同的结果。

这就是异步的本质。您对http请求何时完成以及该数据何时可用的控制有限。有关解决方案,请参阅。您是否尝试过$rootScope。$watch如果您使用的是angular router,则可以定义解析块,以便在加载
room
调用之前,页面不会导航到GameCtrl。这是确保在进入使用服务的页面之前加载服务的常用方法。感谢@Benmj,我在controller中使用了resolve,它暂时有效。这是否意味着它在app.run()中等待进程完成,然后启动app.controller?
angular.module('GameModule', [])
.run([function ("injectors...") {
    $http.get("/rooms").success(function(result){
        $rootScope.rooms = result;

    }).error(function(error){
        console.log('Error fetching rooms');
    });
}])
.controller('GameCtrl', ['$scope', function ($scope) {
    console.log($rootScope.rooms);  
}]);
app.lazyload.factory('myService',['$http','$q', function($http,$q) {

        return{
            showAll :function ()
            {
                var deferred = $q.defer();
                $http.post('rest/getAll?cd='+ (new Date()).getTime())
                .success(function(data)
                {
                    deferred.resolve(data);
                })
                .error(function(data)
                {
                    deferred.reject(null);
                    console.log("in error block");
                });

                 return deferred.promise;
            }
        };

    }]);
    function showAll()
                {
                    var promise = myService.showAll();

                    promise.then(function success(data) {
                        $scope.allitems = data;
                        console.log(data);
                        console.log('$scope.allitems'+$scope.allitems[0].name);

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

                };