AngularJS错误:$rootScope:infdig Infinite$digest循环:达到10次$digest



我使用的是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语句将向父(或祖父母)函数返回字符串是错误的。每个嵌套级别都需要返回。

最新更新