【问题标题】:AngularJS Error: $rootScope:infdig Infinite $digest Loop: 10 $digest() iterations reached. Aborting! Watchers fired in the last 5 iterations: []AngularJS 错误:$rootScope:infdig 无限 $digest 循环:达到 10 个 $digest() 迭代。中止!在最后 5 次迭代中触发的观察者:[]
【发布时间】: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


【解决方案1】:

检查这可能会解决您的问题。

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

【讨论】:

    【解决方案2】:

    @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 语句会将字符串返回给父(或祖父)函数是错误的。每一层嵌套都需要返回。

    【讨论】:

      猜你喜欢
      • 2017-01-11
      • 2016-05-25
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 2014-11-01
      • 1970-01-01
      相关资源
      最近更新 更多