AngularJS错误:$ rootScope:infdig Infinite $ digest循环:达到10 $ digest()次迭代。中止!观察者在最近5次迭代中被解雇:[]

时间:2016-04-01 12:41:36

标签: javascript angularjs angular-promise angular-resource

我正在使用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次迭代中被解雇:[]

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);
}; 

2 个答案:

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