我使用的是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".错误:[$rootScope:infdig]已达到10$digest()迭代。正在中止!在最近5次迭代中被解雇的观察者:[]http://errors.angularjs.org/1.5.0/$rootScope/indig?p0=10&p1=%5B%5D角度js:68范围内$摘要(angular.js:16702)范围内$应用(angular.js:16928)完成时(angular.js:11266)完成请求(angular.js:11464)在XMLHttpRequest.requestLoaded(angular.js:11405)未捕获错误:已达到[$rootScope:infdig]10$digest()迭代。正在中止!观察者在最近5次迭代中被解雇:[]
isProcessed()函数:
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);
};
检查这是否可以解决您的问题。
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;
}
@georgeawg我希望getOfferStatus返回字符串
函数仅在offer.isDraft
为true时返回字符串,否则返回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
语句将向父(或祖父母)函数返回字符串是错误的。每个嵌套级别都需要返回。