$http调用似乎产生了无限$digest循环

$http call seems to produce Infinite $digest Loop

本文关键字:无限 digest 循环 产生了 http 调用      更新时间:2023-09-26

我需要在我的AngularJS应用程序中检查用户的状态以显示特定的功能内容。在我看来,我有以下 HTML:

<span ng-show="authService.isSuperUser()">You are a Super User</span>

要确定用户是否具有"超级用户"状态并显示跨度,我的服务中有以下 JavaScript 代码

this.isSuperUser = function () {
    if (loggedInUser !== null) { // loggedInUser is true in most cases
        return getSuperUser();
    } else {
        return false;
    }
};
var getSuperUser = function(){
    return $http({method: 'GET', url: '/url/to/rest/service/for/superuser' }).then(function (response) {
        return response; // this is either true or false and is working
    }, function () {
        console.log('Yikes! An Error!');
        return false;
    });
};

现在getSuperUser函数提供了正确的结果(真或假),但是当我在浏览器中运行它时,我生成了数千个无限$digest循环错误。我显然以错误的方式处理这个问题,关于如何最好地实施我的解决方案并停止产生错误的任何想法?当用户转到特定 URL(如 myapp.com/#/youraccount)并且之前未在应用中加载ng-show="authService.isSuperUser()"时,将加载 HTML 视图。

试试这段代码:

.factory('authService', function($http) {
    return {
         isSuperUser: function () {
             return $http.get(......);
         }
    };
})
.controller('MyCtrl', function($scope, authService) {
    $scope.isSuperUser = authService.isSuperUser();
})
<span ng-show="isSuperUser">you are a super user</span>

当控制器运行时,它会调用启动 Ajax 调用并立即返回 promise 的服务。

您将该承诺复制到名为isSuperUser的$scope变量。

您的观点与该承诺绑定。 当它得到解决时,它将是真或假,ng-show将相应地运行。 在那之前它被认为是错误的(我想:P)