2013-06-08 16 views
15

Nie mogę sprawić, że $ httpProvider.interceptors faktycznie przechwycić. Stworzyłem próbkę na JSFiddle, która loguje się, gdy przechwytywacz jest uruchamiany i kiedy odpowiedź HTTP http jest udana. Przechwytywacz żądań jest uruchamiany po tym, jak odpowiedź jest już zwrócona jako zakończona pomyślnie. Wydaje się to nieco wstecz.AngularJS przechwytuje wszystkie żądania HTTP http:

Nie mogę użyć transformRequest, ponieważ muszę zmienić parametry w konfiguracji. Ta część nie jest pokazana w próbce.

Używam angularjs 1.1.5

http://jsfiddle.net/skeemer/K7DCN/1/

JavaScript

var myApp = angular.module('myApp', []); 

myApp.factory('httpInterceptor', function ($q) { 
    return { 
     request: function (config) { 
      logIt('- Modify request'); 
      return config || $q.when(config); 
     } 
    }; 
}); 

myApp.config(function ($httpProvider) { 
    $httpProvider.interceptors.push('httpInterceptor'); 
}); 

function MyCtrl($scope, $http) { 
    // Hit a server that allows cross domain XHR 
    $http.get('http://server.cors-api.appspot.com/server?id=8057313&enable=true&status=200&credentials=false') 
    .success(function (data) { 
     //logIt(data[0].request.url); 
     logIt('- GET Successful'); 
    }); 

    $scope.name = 'Superhero'; 
} 


// Just the logging 
var logs = document.getElementById('logs'); 

function logIt(msg) { 
    var e = document.createElement('div'); 
    e.innerHTML = msg; 
    logs.insertBefore(e, logs.firstChild); 
} 

HTML

<div ng-controller="MyCtrl">Hello, {{name}}!</div> 
<br/> 
<div id="logs"></div> 

Odpowiedz

7

Żądanie przechwytywania nie został uruchomiony po dane są zwracane. Już działa. Twoja funkcja logIt wstawia najnowszą wiadomość na górze. Jeśli zmienisz kod, aby korzystać z usługi $ log, zobaczysz, że przechwytujący jest uruchamiany jako pierwszy.

+3

Wow ... czując się teraz głupio. W każdym razie dzięki! Wyobrażam sobie w moim drugim kodzie, że korzystałem z przestarzałych $ httpProvider.responseInterceptors zamiast $ httpProvider.interceptors. – skeemer

18

Jeśli chcesz wybrać opcję, aby zaakceptować/odrzucić wniosek w czasie przechwytywania należy używać $ httpProvider.responseInterceptors, patrz poniższy przykład:

$httpProvider.responseInterceptors.push(function($q) { 
    return function(promise){ 
     var deferred = $q.defer(); 
     promise.then(
      function(response){ deferred.reject("I suddenly decided I didn't like that response"); }, 
      function(error){ deferred.reject(error); } 
     ); 
     return deferred.promise; 
    }; 
}); 

EDIT Nie czytać komentarz rzeczywiście responseInterceptors teraz jest przestarzały to jak to zrobić w zamian:

$httpProvider.interceptors.push(function($q) { 
    return { 
     request: function(config){ return config; }, 
     response: function(response) { return $q.reject(response); } 
    }; 
}); 

dowiedziałem się czegoś pożytecznego, dzięki