2017-06-17 43 views
4

我有一个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); 
+0

社区注意事项:由于其性质,我发现很难为这个问题创建一个小提琴/ plnkr。如果有帮助,那么在GitHub上发布一个[issue](https://github.com/chieffancypants/angular-loading-bar/issues/360)链接回来。任何输入是受欢迎的。 – cst1992

+0

是'reject.status'落入'401'还是'403'?如果不是,请求可能永远不会结束 – Sravan

+0

@Sravan也没有。这导致了单独的冲突。在拦截器中添加一个'console.log'不会打印任何东西。相反,持久性在消化周期内发生得更深。 – cst1992

回答

0

此问题已得到解决。

事实证明,在任何Unauthorized请求,即返回到线11上面剩余未决永远的,因为当时在deferred对象.resolve().reject()没有呼叫的承诺的情况。

因此,加载栏的拦截器被阻止。

我最终完全取消了自定义承诺并解决了问题。