2017-04-04 62 views
1

我需要在處理完所有$ http呼叫時觸發事件。我還需要知道是否有任何通話失敗。我嘗試使用stackoverflow上的可用解決方案,例如使用攔截器。

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'); 
}]); 

但是,通過這種方法,在每個$ http調用完成後調用$rootScope.$broadcast('loading:finish')。我想在所有$ http呼叫結束時觸發一個事件。

我不能使用$q,因爲$http我的頁面調用屬於各種指令,不在同一個控制器中調用。

+1

你可以使用'$ http.pendingRequests'。你可以檢查$ http.pendingRequests.length!== 0; – talentedandrew

+1

你可以創建一個服務來保存所有這些$ http調用,因爲$ http調用返回promise,這個服務是promise的集合,所以你只需要寫如下: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我已經更新了我的答案,以解決您的第二個問題。請看一看。 – schaturv

相關問題