2017-04-04 2 views
1

Ich muss ein Ereignis auslösen, wenn alle meine $ http Anrufe verarbeitet werden. Ich muss auch wissen, ob ein Anruf fehlgeschlagen ist. Ich habe versucht, die verfügbaren Lösungen auf stackoverflow wie mit einem Interceptor zu verwenden.

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

jedoch bei diesem Ansatz die $rootScope.$broadcast('loading:finish') aufgerufen wird, nachdem jeder $ http Anruf beendet ist. Ich möchte ein Ereignis auslösen, wenn alle $ http-Aufrufe beendet sind.

Ich kann $q nicht verwenden, da die Aufrufe $http auf meiner Seite zu verschiedenen Direktiven gehören und nicht in demselben Controller aufgerufen werden.

+1

können Sie '$ http.pendingRequests' verwenden. Sie können überprüfen, ob $ http.pendingRequests.length! == 0; – talentedandrew

+1

Sie können einen Dienst erstellen, der all diese $ http-Aufrufe enthält, da $ http Aufrufe return promise, dieser Dienst ist eine Sammlung von Versprechen, also müssen Sie nur schreiben wie: Promise.all (....) – ABOS

+0

@ABOS, Ich werde über Promise.all() lesen und es versuchen. Werde jedoch mit Fragen an Sie zurückkommen! Vielen Dank. – InquisitiveP

Antwort

0

Sie können den folgenden Code verwenden, um die Anzahl der ausstehenden Anfragen für $ http zu überprüfen. Ich benutze dies, um den Lade-Spinner in meinem Projekt anzuzeigen.

$http.pendingRequests.length 

Für eine Spur ausgefallener halten und den Erfolg nennt man so etwas wie diese verwenden:

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

Im Grunde habe ich erstellt 2 Stammbereich Variablen und es als Zähler verwendet Zählung der Erfolg aufrecht zu erhalten und sind gescheitert Anrufe, die Sie verwenden können, wo immer Sie wollen.

+0

@talentedrew - Dies ist, was ich gerade benutze. Es gibt jedoch keine Möglichkeit zu wissen, ob einer meiner Anrufe fehlgeschlagen ist. Ich muss das Ereignis nur bei erfolgreichem Abschluss aller $ http-Aufrufe auslösen. – InquisitiveP

+0

Interceptors wäre der beste Weg, um die Anzahl der fehlgeschlagenen und erfolgreichen Anrufe zu ermitteln. – schaturv

+0

@InquisitiveP Ich habe meine Antwort aktualisiert, um auch Ihr zweites Problem zu lösen. Bitte guck dir das an. – schaturv

Verwandte Themen