仅在角度服务从服务器获取数据并完成其执行后才执行某些代码块

时间:2014-09-29 07:34:50

标签: javascript angularjs angular-promise

在我的服务中:

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但却无法理解,在我的情况下我应该如何使用承诺。

2 个答案:

答案 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) {

中执行