我正在使用AngularJS,我在具有嵌套承诺的服务中有一个函数:
this.getOfferStatus = function (offer) {
if(offer.isDraft){
return 'Draft';
} else {
this.isProcessed(offer).then(function (isProcessed) {
if (isProcessed) {
this.isAccepted(offer).then(function (isAccepted) {
if (isAccepted) {
if (isExpired(offer)) {
return 'Expired';
} else {
if (this.isActive(offer).then(function (isActive) {
return 'Active';
}, function (err) {
console.error(err);
}));
}
} else {
return 'Rejected';
}
}, function (err) {
console.error(err);
})
} else {
return 'Pending';
}
}, function (err) {
console.error(err);
});
}
}
}
但是,当我在控制器中调用此函数时,我收到此错误:
XHR完成加载:GET " http://localhost:8080/localbusiness/1/offers/Absolute&#34 ;.错误: [$ rootScope:infdig]达到10 $ digest()次迭代。中止! 观察者在最近5次迭代中被解雇:[] http://errors.angularjs.org/1.5.0/$rootScope/infdig?p0=10&p1=%5B%5D 在angular.js:68 在Scope。$ digest(angular.js:16702) 在Scope。$ apply(angular.js:16928) 完成时(angular.js:11266) at completeRequest(angular.js:11464) 在XMLHttpRequest.requestLoaded(angular.js:11405)未捕获错误:[$ rootScope:infdig] 10 $ digest()迭代到达。中止! 观察者在最近5次迭代中被解雇:[]
this.isProcessed = function (offer) {
var deferred = $q.defer();
var LocalBusinessResource =
$resource(apiService + '/offers/:id/processed', {id: '@id'});
LocalBusinessResource.get({id: offer.id}, function (result) {
deferred.resolve(result);
}, function (err) {
return $q.reject(err);
alert('check your server connection ' + angular.toJson(err));
});
return deferred.promise;
}
$scope.getStatus = function(offer){
return offerService.getOfferStatus(offer);
};
答案 0 :(得分:0)
检查这可能会解决您的问题。
this.getOfferStatus = function (offer) {
var parent = this;
if(offer.isDraft){
parent.setStatus('Draft')
}else{
this.isProcessed(offer).then(function (isProcessed) {
if (isProcessed) {
this.isAccepted(offer).then(function (isAccepted) {
if (isAccepted) {
if (isExpired(offer)) {
parent.setStatus('Expired')
} else {
if (this.isActive(offer).then(function (isActive) {
parent.setStatus('Active')
}, function (err) {
console.error(err);
}));
}
}else{
parent.setStatus('Rejected')
}
}, function (err) {
console.error(err);
})
} else {
parent.setStatus('Pending')
}
}, function (err) {
console.error(err);
});
}
}
this.setStatus = function(status){
$scope.status = status;
}
答案 1 :(得分:0)
@georgeawg我希望getOfferStatus返回一个字符串
该函数仅在offer.isDraft
真实时返回一个字符串,否则返回null
。
this.getOfferStatus = function (offer) {
if(offer.isDraft){
//Returns a string here
return 'Draft';
}else{
this.isProcessed(offer).then(function anon1(isProcessed) {
if (isProcessed) {
this.isAccepted(offer).then(function anon2(isAccepted) {
if (isAccepted) {
if (isExpired(offer)) {
//This returns to function anon2
return 'Expired';
} else {
if (this.isActive(offer).then(function anon3(isActive) {
//This returns to anon3
return 'Active';
}));
}
}else{
//This returns to anon2
return 'Rejected';
}
})
} else {
//This returns to anon1
return 'Pending';
}
}, function (err) {
console.error(err);
});
}
//
//Returns null here
//
}
只有一个return
语句返回getOfferStatus
。所有其他return
语句都在.then
方法内的匿名函数内。
认为那些return
语句将字符串返回到父(或祖父母)函数是错误的。每个嵌套级别都需要返回。