我正在开发一个angularjs应用程序作为我的angularjs学习的一部分。我有控制器,从那里我打电话给服务层。
leagueManager.service("teamsService", function($http){
var teams = {};
$http.get('data/teams.json').then(function(data) {
teams = data;
});
this.getTeams = function(){
return teams;
};
});
我注意到由于$ http.get.then的异步性质,数据不会立即被检索,因此当我从控制器调用getTeams()时,我不会得到“团队”(teamsController),我什么都没得到。
我知道如何解决这个问题?
第二次尝试: 在阅读下面的帖子建议的关于延迟和角度承诺之后,我尝试了以下但它仍然没有效果。我的变量团队没有按照我想要的方式填充,之后会填充它们,这对我的用户界面没有帮助:
我的控制器 teamsController.js
leagueManager.controller('teamsController', function($scope, $location, teamsService, $routeParams){
//init function to initialize data when controller is called everytime.
var init = function(){
$scope.teams = [];
var promise = teamsService.getTeams();
promise.then(
function(data){
console.log("teams after promise:="+data);
$scope.teams = data;
}
,function(reason)
{
alert('Failed: ' + reason);
}
);
console.log("teams in the scope:="+$scope.teams);
};
init();
});
这是我的 ServiceLayer teamsService.js
leagueManager.service("teamsService", function($http, $q){
this.getTeams = function(){
var deferred = $q.defer();
var url = 'data/teams.json';
$http.get(url).success(function(data, status) {
// Some extra manipulation on data if you want...
deferred.resolve(data);
}).error(function(data, status) {
deferred.reject(data);
});
return deferred.promise;
}
});
你或别人可以帮我解决我做错的事吗? 这是执行时在浏览器控制台中打印的内容:
范围内的团队:= teamsController.js:27
承诺后的团队:= [object Object],[object Object],[object Object],[object Object],[object Object]
这只是表明我确实得到了json对象,但在我想要的时候却没有。出于某种原因,这种违背/承诺的事情没有任何影响。
请帮助这个新的角窦真理
答案 0 :(得分:19)
是的,您需要使用promise接口。因此,不必返回团队对象,而是直接返回一个承诺:
承诺资源:
在服务中:
leagueManager.service("teamsService", function($http){
var deferred = $q.defer();
$http.get('data/teams.json').then(function(data) {
deferred.resolve(data);
});
this.getTeams = function(){
return deferred.promise;
};
});
然后在控制器中:
$scope.team = {};
var promise = teamsService.getTeams();
promise.then(function(data) {
$scope.teams = data;
});
答案 1 :(得分:1)
这应该可以正常工作:
myApp.factory('mainFactory',['$http',function($http){
var mainFactory = {};
mainFactory.getRandomUser = function(){
var promise;
if(!promise){
promise = $http.get('http://api.randomuser.me/').success(function(d){
return d;
});
return promise;
}
};
mainFactory.getRandomImage = function(){
var promise;
if(!promise){
promise = $http.get('http://lorempixel.com/400/200/').success(function(d){
return d;
});
return promise;
}
};
return mainFactory;
}]);