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}
});
})();
答案 0 :(得分:4)
没关系 - 我弄清楚了。我正在从jQuery项目迁移代码,在jQuery中,你会返回一个这样的承诺:
return deferred.promise();
由于Angular有自己的延迟功能$q
,我开始使用它,却没有意识到返回一个承诺的符号略有不同:
return deferred.promise;
没有()
,这真的搞砸了。现在一切似乎都运转正常。