AngularJS - 函数Expected或Object不是函数

时间:2014-07-08 17:29:04

标签: angularjs promise

AngularJS新手,我想我不知道如何在同一家工厂调用另一个Promise方法。每次我的代码到达processPerson中的$ http.get时,我在IE中得到一个Function Expected错误,或者Chrome中的Object不是Function错误。我曾尝试多次重组代码,多个工厂等,并且通常会遇到相同的错误。我唯一能让它工作的是如果我将processPerson函数嵌入的函数组合在getPersonnel的成功中。

代码:

(function(){

var app = angular.module('hrSite', ['personnel']);

app.controller('PersonnelController', function($scope, personnelFactory){
    var personnelPromise = personnelFactory.getPersonnel();
    personnelPromise.then(function(personnel){
        var perDefs = new Array();
        $.each(personnel.data.value, function( i, person ){
            var perDef = personnelFactory.processPerson(person);
            perDefs.push(perDef);
        });
        $q.all(perDefs).then(function(){
            $scope.personnel = personnel.data.value;
        });
    });
});

})();

(function(){

var personnelModule = angular.module('personnel', []);

personnelModule.factory('personnelFactory', function($http, $q) {

        var getPersonnel = function(){
            return $http.get("/sites/Development/_api/web/lists/getbytitle('Personnel')/items");
        };

        var processPerson = function(person){
            var deferred = $q.defer();
                $http.get("/sites/Development/_api/web/lists/getbytitle('Personnel Skills')/items?$select=*,Skill/Id,Skill/Title&$filter=PersonId eq '"+person.Id+"'&$expand=Skill").then(function(skills){
                    person.Skills = skills.data.value;
                    person.SkillsId = [];
                    $.each(skills.data.value, function( j, skill ){
                        person.SkillsId.push(skill.Id);
                    });
                    deferred.resolve();
                });
            return deferred.promise();
        };
        return {getPersonnel: getPersonnel,
                processPerson: processPerson}
});
})();

1 个答案:

答案 0 :(得分:4)

没关系 - 我弄清楚了。我正在从jQuery项目迁移代码,在jQuery中,你会返回一个这样的承诺:

return deferred.promise();

由于Angular有自己的延迟功能$q,我开始使用它,却没有意识到返回一个承诺的符号略有不同:

return deferred.promise;

没有(),这真的搞砸了。现在一切似乎都运转正常。