2017-04-04 11 views
1

すべての$ httpコールが処理されたときにイベントをトリガーする必要があります。また、コールが失敗したかどうかを知る必要があります。私は、インターセプタを使用するなどのstackoverflowで利用可能なソリューションを使用してみました。すべての$のHTTP呼び出しが完了した後

angular.module('app').factory('httpInterceptor', ['$q', '$rootScope', 
    function ($q, $rootScope) { 
    var loadingCount = 0; 

    return { 
     request: function (config) { 
     if(++loadingCount === 1) { 
      $rootScope.$broadcast('loading:progress'); 
     } 
     return config || $q.when(config); 
     },  
     response: function (response) { 
     if(--loadingCount === 0) { 
      $rootScope.$broadcast('loading:finish'); 
     } 
     return response || $q.when(response); 
     },  
     responseError: function (response) { 
     if(--loadingCount === 0) { 
      $rootScope.$broadcast('loading:finish'); 
     } 
     return $q.reject(response); 
     } 
    }; 
    } 
]).config(['$httpProvider', function ($httpProvider) { 
    $httpProvider.interceptors.push('httpInterceptor'); 
}]); 

しかし、このアプローチで$rootScope.$broadcast('loading:finish')が呼び出されます。すべての$ http呼び出しが終了したときにイベントをトリガーしたい

私のページ内の$httpコールはさまざまなディレクティブに属し、同じコントローラでは呼び出されないため、$qは使用できません。

+1

あなたは '$ http.pendingRequests'を利用することができます。 $ http.pendingRequests.length!== 0かどうかを確認できます。 – talentedandrew

+1

$ httpコールが約束を返すので、これらのすべての$ httpコールを保持するサービスを作成できます。このサービスは約束の集合なので、次のように書く必要があります。Promise.all(....) – ABOS

+0

@ABOS、私はPromise.all()について読んでみる。しかし、あなたの質問に戻ってきます!ありがとう。 – InquisitiveP

答えて

0

以下のコードを使用して、$ httpの保留中のリクエストの数を確認できます。私はこれを使って私のプロジェクトでスピナーをロードしています。失敗を追跡するための

$http.pendingRequests.length 

と成功は、あなたがこのようなものを使用することができます呼び出します。

angular.module('myApp', []) 
.run(function ($rootScope){ 
    $rootScope.failedCalls = 0; 
    $rootScope.successCalls = 0; 
}) 
.controller('MyCtrl', 
function($log, $scope, myService) { 
$scope.getMyListing = function(employee) { 
    var promise = 
     myService.getEmployeeDetails('employees'); 
    promise.then(
     function(payload) { 
      $scope.listingData = payload.data; 
      $rootScope.successCalls++; //Counter for success calls 
     }, 
     function(errorPayload) { 
     $log.error('failure loading employee details', errorPayload); 
     $rootScope.failedCalls++; //Counter for failed calls 
     }); 
}; 
}) 
.factory('myService', function($http) { 
    return { 
    getEmployeeDetails: function(id) { 
    return $http.get('/api/v1/employees/' + id); 
    } 
} 
}); 

基本的に私は、2つのルートスコープ変数を作成し、成功の数を維持するために、カウンタとしてそれを使用して失敗したがどこでも好きな場所で使うことができます。

+0

@talentedandrew - これは私が現在使っているものです。しかし、私の呼び出しが失敗したかどうかを知る方法はありません。すべての$ http呼び出しが正常に完了した場合にのみイベントをトリガーする必要があります。 – InquisitiveP

+0

インターセプタは失敗したコールと成功したコールの数を調べる最も良い方法です。 – schaturv

+0

@InquisitiveP私はあなたの2番目の問題を解決するために私の答えを更新しました。見てください。 – schaturv

関連する問題