在我的服务中:
appRoot.factory('ProgramsResource', function ($resource) {
return $resource('Home/Program', {}, { Program: { method: 'get', isArray: false } })
});
在我的控制器中:
appRoot.controller('ProgramCtrl', function ($scope, ProgramsResource) {
$scope.searchPrograms = function () {
$scope.Programs = ProgramsResource.get(
{
Name: $scope.searchProgramName,
});
};
$scope.SortBy = "Name";
$scope.searchPrograms();
//Lines of code which I want to execute only after the searchPrograms() completes its execution
$scope.TotalItems = $scope.Programs.TotalItems;
$scope.ItemsPerPage = $scope.Programs.ItemsPerPage;
});
searchPrograms(); 负责从服务器获取数据。只有在行 $ scope.searchPrograms(); 后才能执行以下代码:
$scope.TotalItems = $scope.Programs.TotalItems;
$scope.ItemsPerPage = $scope.Programs.ItemsPerPage;
但它不会那样发生。它不等待searchPrograms()完成它的操作并执行它下面的代码行。 就像在js中一样,它不会等待ajax完成并执行它下面的行,这种情况正在发生。 为了在ajax完成之后执行某些代码,在js中存在回调函数的概念,并且在角度中存在promise的概念。
我对角度承诺非常友善article但却无法理解,在我的情况下我应该如何使用承诺。
答案 0 :(得分:2)
你可以在ProgramResource.get中添加一个回调函数参数:
$scope.searchPrograms = function () {
$scope.Programs = ProgramsResource.get(
{
Name: $scope.searchProgramName,
}, function () {
$scope.TotalItems = $scope.Programs.TotalItems;
$scope.ItemsPerPage = $scope.Programs.ItemsPerPage;
});
};
答案 1 :(得分:1)
你应该使用$ q和延期承诺,这样你就可以做这样的事情
$scope.searchPrograms().then(function(data) { // data is the data that search programs should return
$scope.TotalItems = $scope.Programs.TotalItems;
$scope.ItemsPerPage = $scope.Programs.ItemsPerPage;
}
确保searchPrograms返回一个承诺。
var deferred = $q.defer();
var callback = function (response) {
if(response.error) {
deferred.reject(response.error)
}
deferred.resolve(response);
};
//Your service call that need a callback like myService.request(callback);
return deferred.promise;
因此,当请求完成时,代码将在.then(function(data) {