我是这样的服务:
angular.module('module')
.factory('UserList', function ($http) {
return {
getUserList: $http.get('/portal-services/NemesysPortalBackend/rest/user/all')
};
});
这限制我做
UserList.getUserList.then(function(res){$scope.data = res.data;})
在我需要它的每个控制器中。 是否有任何方式来" facade"它只是
$scope.data = UserList.getUserList();
由于
答案 0 :(得分:0)
我在此假设用户列表并不经常更改,因此您可以将其缓存到变量中......否则,每次您希望时都需要拨打电话列表更改(或使用间隔重新加载列表?)
在真正需要之前获取数据称为"渴望加载"
angular.module('module').factory('UserList', function ($http, $q, $interval) { // import $q as well
var userList = []; // initialized as blank array
var refreshList = function(){
var deferred = $q.defer();
$http.get('/portal-services/NemesysPortalBackend/rest/user/all').then(
function(successResponse){
userList = successResponse.data;
deferred.resolve(successResponse);
},function(failureResponse){
// do something on error?
deferred.reject(failureResponse);
});
return deferred.promise;
}
refreshList(); // eager load, run right away
// i don't recommend this next line, there are better ways of doing this
$interval(refreshList(), 1000*60); // get new list every 60 seconds
return {
getUserList: function(){ return userList; }, // return user list only
refreshList: function(){ refreshList(); } // return promise which getting new list
};
});
同样,我不建议使用$ interval来重新加载列表,而是在任何时候对用户列表进行更新时调用refreshList
例如:
angular.module('module').controller('userCtrl', function(UserList) {
$scope.data = UserList.getUserList();
// once you change the user list, call a refresh
UserList.addUser().then(UserList.refreshList()).then(function(){
$scope.data = UserList.getUserList();
);
});
答案 1 :(得分:0)
你不能这样做,因为JavaScript是单线程的。这意味着,当您使用某些异步调用时,您无法使其同步。 Javascript中没有等待(*)。您无法阻止函数调用以等待服务器的结果。
即使你如此努力:
function getResult() {
var result;
UserList.getUserList.then(function(res) {
result = res.data; // this should break the loop below
});
while (!result) {}; // active waiting, wasting CPU cycles
return result;
}
...它不起作用,因为在当前运行的代码(即无限循环)结束之前不会执行回调函数。像这样的无限循环将永远冻结整个应用程序。
(*)这并不意味着您无法安排稍后调用的函数。承诺和关闭对它有很大的帮助。