2014-05-22 7 views
22

Qual è l'alternativa di $ httpProvider.responseInterceptors poiché viene interrotta in AngularJS V1.3?

miei intercettori, che stava lavorando con angolare JS 1.2 non sta lavorando con la versione 1,3

var angularErrorHandling = angular.module('xx-http-error-handling', []); 
angularErrorHandling.config(function ($provide, $httpProvider, $compileProvider) { 
    var elementsList = $(); 

    push function to the responseInterceptors which will intercept 
    the http responses of the whole application 
    $httpProvider.responseInterceptors.push(function ($timeout, $q) { 
     return function (promise) { 
      return promise.then(function (successResponse) {     
       // if there is a successful response on POST, UPDATE or DELETE we display 
       // a success message with green background 
       if (successResponse.config.method.toUpperCase() == 'GET') { 
        var length = successResponse.data.length;      
        if (length == 0) 
        { 
         var countactivetoaster = $('#toast-container').find('.toast').length; 
         if (countactivetoaster == 0) { 
          toastr.warning('No Records Found!', ''); 
         } 
        }      
        return successResponse; 
       } 
       else if (successResponse.config.method.toUpperCase() == 'PUT') {     
        toastr.success('Data Saved Sucessfully..', ''); 
        return successResponse; 
       } 
       else if (successResponse.config.method.toUpperCase() == 'POST') {     
        toastr.success('Data Saved Sucessfully..', ''); 
        return successResponse; 
       } 
      }, 
      // if the message returns unsuccessful we display the error 
      function (errorResponse) { 
       switch (errorResponse.status) { 
        case 400: // if the status is 400 we return the error       
         toastr.error('400 error.', ''); 
         // if we have found validation error messages we will loop through 
         // and display them 
         if (errorResponse.data.errors.length > 0) { 
          for (var i = 0; i < errorResponse.data.errors.length; i++) { 
           toastr.error('xx-http-error-validation-message', ''); 
          } 
         } 
         break; 
        case 401: // if the status is 401 we return access denied        
         toastr.error('Wrong email address or password!', ''); 

         break; 
        case 403: // if the status is 403 we tell the user that authorization was denied       
         toastr.error('You have insufficient privileges to do what you want to do!', ''); 
         break; 
        case 500: // if the status is 500 we return an internal server error message        
         toastr.error('Error: <br />' + 
          errorResponse.data.exceptionMessage != null && errorResponse.data.exceptionMessage.length > 0 ? errorResponse.data.exceptionMessage : 
          errorResponse.data.message, ''); 
         break; 
        default: // for all other errors we display a default error message        
         toastr.error('Error ' + errorResponse.status + ': ' + errorResponse.data.message, ''); 
       } 
       return $q.reject(errorResponse); 
      }); 
     }; 
    }); 

    $compileProvider.directive('httpErrorMessages', function() { 
     return { 
      link: function (scope, element, attrs) { 
       elementsList.push($(element)); 
      } 
     }; 
    }); 
}); 
+0

https://github.com/angular/angular.js/issues/7266 e sul perché e sulla soluzione: https://github.com/angular/angular.js/pull/7267 –

risposta

36

Devi usare la nuova sintassi intercettore (che è più pulito/meglio a mio avviso):

vedrai che ora, è possibile gestire 4 intercettori a parte: richiesta, requestError, risposta, responseError

// register the interceptor as a service 
    $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) { 
    return { 
     // optional method 
     'request': function(config) { 
     // do something on success 
     return config; 
     }, 

     // optional method 
    'requestError': function(rejection) { 
     // do something on error 
     if (canRecover(rejection)) { 
      return responseOrNewPromise 
     } 
     return $q.reject(rejection); 
     }, 



     // optional method 
     'response': function(response) { 
     // do something on success 
     return response; 
     }, 

     // optional method 
    'responseError': function(rejection) { 
     // do something on error 
     if (canRecover(rejection)) { 
      return responseOrNewPromise 
     } 
     return $q.reject(rejection); 
     } 
    }; 
    }); 

    $httpProvider.interceptors.push('myHttpInterceptor'); 

Maggiori informazioni: https://docs.angularjs.org/api/ng/service/$http (capitolo Interceptor)

+0

Sto ricevendo errore: Uncaught ReferenceError: $ provider non è definito – Vipul

+1

Ti ho dato l'esempio del documento angularJS .. trova/correggi il bug o modifica il tuo post per mostrare il nuovo codice. –

+1

Ha funzionato per me quando ho sostituito $ provider con il mio oggetto applicazione. – Vipul