坚持无限重复的摘要循环

时间:2017-06-17 20:06:45

标签: angularjs angular-digest

我有一个Angular SPA我正在使用Angular Loading Bar和AngularJS v1.4.9。

现在已经有一段时间了,在应用程序加载后,条形码一段时间后卡住了,表明并非所有请求都已完成。此外,我的代码中的console.log()之一已连续发射,每秒约1-2次。栏完成,当用户重新加载页面时,console.log正常工作(但不会自行停止)。

console.log()设置在附加到ng-disabled指令的函数内,因此我知道它是正在进行的摘要周期的指示。

我使用Chrome作为浏览器,最近我进行了分析运行。 这是我看到的一些屏幕截图: Bird's eye view

这是一个广阔的视野。如图所示,它首先发生在100毫秒,然后是400,然后是600,依此类推(我做了3s运行)。

strip 1 这是第一个垂直条带。并非所有这些看起来都与此完全相同,但completeOutstandingRequest,timeout和Browser.self.defer方法始终存在。 searchDisable和log方法是我们的​​,日志是我上面谈到的。 self.url 这是另一个用于比较的,但这有点不同 - 它有另一个浏览器方法:self.url。我不确定它的作用。

以下是我发现的一些可能相关的问题:

Timeout callback can occur in the middle of a digest cycle in Firefox
$browser.defer ends up triggering changeDetection in zonejs through settimeout

P.S。我认为这个问题首先是在我们为代码添加一些拦截器以进行一些自动重定向时开始的 - 例如当会话超时且用户点击某些内容时,他会自动返回登录页面重新登录。

这是拦截器:

        interceptor.$inject = ['$rootScope', '$q'];
        function interceptor($rootScope, $q) {
            return {
                responseError: function (rejection) {
                    var config = rejection.config || {};
                    if (!config.ignoreAuthModule) {
                        switch (rejection.status) {
                            case 401:
                                var deferred = $q.defer();
                                $rootScope.$broadcast('event:auth-loginRequired', rejection);
                                return deferred.promise;
                            case 403:
                                $rootScope.$broadcast('event:auth-forbidden', rejection);
                                break;
                        }
                    }
                    return $q.reject(rejection);
                }
            };
        }

        $httpProvider.interceptors.push(interceptor);

1 个答案:

答案 0 :(得分:0)

这个问题已经解决了。

事实证明,如果发出任何Unauthorized个请求,则上面第11行返回的承诺将永久保留,因为此处未调用.resolve().reject() deferred对象。

结果,装载栏的拦截器被阻挡了。

我最终完全删除了自定义承诺,这解决了问题。