2013-06-08 12 views
15

मुझे वास्तव में अवरोध करने के लिए $ httpProvider.interceptors प्राप्त नहीं हो रहा है। मैंने JSFiddle पर एक नमूना बनाया जो इंटरसेप्टर चलाने पर लॉग करता है और जब $ http प्रतिक्रिया सफल होती है। प्रतिक्रिया के बाद अनुरोध पहले से ही लौटाए जाने के बाद अनुरोध इंटरसेप्टर चलाया जाता है। यह थोड़ा पीछे की ओर लगता है।

मैं transformRequest का उपयोग नहीं कर सकता क्योंकि मुझे कॉन्फ़िगरेशन में पैराम को बदलने की आवश्यकता है। वह हिस्सा नमूना में नहीं दिखाया गया है।

मैं उपयोग कर रहा हूँ AngularJS 1.1.5

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

जावास्क्रिप्ट

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

एचटीएमएल

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

उत्तर

7

अनुरोध इंटरसेप्टर के बाद डेटा दिया जाता है नहीं चल रहा है। यह पहले चल रहा है। आपका लॉग इट फ़ंक्शन शीर्ष पर नवीनतम संदेश डालता है। यदि आप $ लॉग सेवा का उपयोग करने के लिए अपना कोड बदलते हैं, तो आप देखेंगे कि इंटरसेप्टर पहले चलता है।

+3

वाह ... अब गूंगा महसूस कर रहा हूँ। हालांकि धन्यवाद! मेरे दूसरे कोड में पता चला कि मैं $ httpProvider.interceptors के बजाय बहिष्कृत $ httpProvider.responseInterceptors का उपयोग कर रहा था। – skeemer

18

आप स्वीकार करते हैं/करने के लिए विकल्प चाहते हैं अवरोधन समय में एक अनुरोध को अस्वीकार कर आप $ httpProvider.responseInterceptors का उपयोग करना चाहिए, नीचे उदाहरण देखें:

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

संपादित अपनी टिप्पणी को पढ़ने नहीं था, वास्तव में responseInterceptors अब अप्रचलित है एक है कि आप इसे कैसे बजाय कैसे करते है:

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

मैं कुछ उपयोगी सीखा है, धन्यवाद

संबंधित मुद्दे