加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – 坚持无限重复的摘要循环

发布时间:2020-12-17 16:59:55 所属栏目:安全 来源:网络整理
导读:我有一个Angular SPA我正在运行 Angular Loading Bar和AngularJS v1.4.9. 一段时间以来,它已经发生了这样的情况:在应用程序加载后,条形图片在一段时间后卡住了,表明并非所有请求都已完成.另外,我在代码中的console.log()之一已经连续触发,每秒大约1-2次.条
我有一个Angular SPA我正在运行 Angular Loading Bar和AngularJS v1.4.9.

一段时间以来,它已经发生了这样的情况:在应用程序加载后,条形图片在一段时间后卡住了,表明并非所有请求都已完成.另外,我在代码中的console.log()之一已经连续触发,每秒大约1-2次.条形图完成,并且当用户重新加载页面时,console.log正常工作(但不会自行停止).

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

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

Bird's eye view

这是一个广阔的视野.如图所示,它首先发生在100ms,然后是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

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

这是拦截器:

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

解决方法

这个问题已经解决了.

事实证明,在任何未经授权的请求的情况下,上面第11行返回的承诺永远保持未决状态,因为在延迟对象中没有调用.resolve()或.reject().

结果,装载杆的拦截器被阻挡.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读