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