【发布时间】:2016-07-21 06:40:41
【问题描述】:
我正在使用 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/infdig?p0=10&p1=%5B%5D 在 angular.js:68 在 Scope.$digest (angular.js:16702) 在 Scope.$apply (angular.js:16928) 完成后(angular.js:11266) 在 completeRequest (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);
};
【问题讨论】:
-
函数结束前不要返回任何东西。执行完所有函数后返回。
-
您还试图返回裸字符串而不是已解决的承诺;这也行不通。
-
@ArunShinde 你有什么解决办法吗?
-
isProcessed()是做什么的?我怀疑这是在创建一个无限递归循环。在.then方法的实现处理程序中使用this关键字也不起作用。承诺规范说this关键字在严格模式下应该是未定义的,而在草率模式下应该是全局上下文。 -
@georgeawg 这里是 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('检查你的服务器连接' + angular .toJson(err)); });返回 deferred.promise; }
标签: javascript angularjs angular-promise angular-resource