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

时间:2014-12-18 04:05:15

标签: javascript angularjs asynchronous service controller

目前我一直在玩角度,我发现很难弄明白。问题是我在app.run()上运行$ http方法。 $ http方法从服务器获取空间并在$ rootScope.rooms var中初始化它。在控制器中我使用了这个房间变量。由于$ http方法是异步的,有时它因为控制器在方法完成之前加载而变为null。我试图以其他方式处理它。

game.js

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);  
}]);

由于room变​​量也将在其他文件中使用,我不想在每个控制器中放入$ http方法,除非没有其他方法。如果我可以使用某种角度的服务

那会很好

1 个答案:

答案 0 :(得分:2)

这是angularJs的正常行为,因为每个REST调用都是异步的。如果您希望它更易于管理或以同步方式运行,那么您将不得不使用" promise" (angularJs中的$ q服务)。请找到代码段

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

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);
                    });

                };

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