2017-06-17 105 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()沒有呼叫的承諾的情況。

因此,加載欄的攔截器被阻止。

我最終完全取消了自定義承諾並解決了問題。