2017-06-17 22 views
4

私はAngular SPAを持っています。私はAngular Loading BarとAngularJS v1.4.9で動作しています。無限に繰り返されるダイジェストループで詰まっています

しばらくの間、アプリが読み込まれた後、しばらくしてからバーが固まって、すべてのリクエストが完了していないことが分かりました。さらに、私がコードで持っているのは、毎秒1〜2回、連続的に発射されています。バーが完了し、ユーザーがページをリロードしたときにconsole.logが正常に機能します(ただし、単独では停止しません)。

は、ng-disabled指示に添付された機能の中に設定されているので、進行中のダイジェストサイクルのインジケータであることがわかります。

私はブラウザとしてChromeを使用していますが、最近プロファイルを実行しました。 ここには、私が見るもののスクリーンショットがあります:

これは広い視野です。ここに示されているように、それは100msで最初に起こり、次に400で、そして600で、そしてそれ以降(私は3秒走った)。

strip 1 これは最初の垂直ストリップです。それらのすべてがこのものとまったく同じに見えるわけではありませんが、completeOutstandingRequest、timeout、およびBrowser.self.deferメソッドは常に存在します。 searchDisableとlogメソッドは私たちのものです。ログは私が上で話しているものです。 self.url もう1つは比較のためですが、これは若干異なります。別のブラウザメソッド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); 
+0

コミュニティへの注意:私は、この性質のためにこの質問のためにfiddle/plnkrを作成するのは難しいと思っています。助けがあれば、こちらにリンクしているGitHubに[issue](https://github.com/chieffancypants/angular-loading-bar/issues/360)が掲載されています。どんな入力も歓迎です。 – cst1992

+0

は 'rejection.status'が' 401'または '403'になりますか?もしそうでなければ、要求は決して終わらないかもしれません。 – Sravan

+0

@スラヴンどちらも。別の競合が発生しています。インターセプタに 'console.log'を追加しても何も印刷されません。むしろ、滞留はダイジェストサイクルの中でより深く起こっている。 @Sravan。 – cst1992

答えて

0

この問題は解決されています。

deferredオブジェクト内の.resolve()または.reject()への呼び出しがなかったので、どんなUnauthorized要求の場合には、上記ライン11に返される約束は永遠に保留残ったことが判明しました。

その結果、ローディングバーのインターセプタがブロックされました。

私は約束を完全に取り除いてしまい、問題を解決しました。

関連する問題