Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 仅在angular服务从服务器获取数据并完成其执行后执行特定代码块_Javascript_Angularjs_Angular Promise - Fatal编程技术网

Javascript 仅在angular服务从服务器获取数据并完成其执行后执行特定代码块

Javascript 仅在angular服务从服务器获取数据并完成其执行后执行特定代码块,javascript,angularjs,angular-promise,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.search

在我的服务中:

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;
});
在我的控制器中:

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;
});
搜索程序()负责从服务器获取数据。并且仅在第$scope.searchPrograms()行之后我想执行以下代码:

$scope.TotalItems = $scope.Programs.TotalItems;
$scope.ItemsPerPage = $scope.Programs.ItemsPerPage;
但事实并非如此。它不会等待searchPrograms()完成操作并执行下面的代码行。 正如在js中一样,它不会等待ajax完成并执行它下面的行,这正在发生。 为了仅在ajax完成后执行某些代码,js中有回调函数的概念,同样,angular中也有承诺的概念


我对有棱角的承诺非常满意,但我无法理解,在我的情况下,我应该如何准确地使用这些承诺

您可以将回调函数参数添加到ProgramResource.get中:

   $scope.searchPrograms = function () {
        $scope.Programs = ProgramsResource.get(
            {
                Name: $scope.searchProgramName,
            }, function () { 
                $scope.TotalItems = $scope.Programs.TotalItems;
                $scope.ItemsPerPage = $scope.Programs.ItemsPerPage;
            });
    };

您应该使用$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;

因此,当请求完成时,代码将在
中执行。然后(函数(数据){

您使用承诺的方式也在工作,但正如@MajoB所给出的,回调函数似乎更容易。无论如何,感谢您的回答。