2013-06-08 26 views
15

Tôi dường như không thể nhận được $ httpProvider.interceptors để thực sự chặn. Tôi đã tạo một mẫu trên JSFiddle ghi nhật ký khi trình chặn chặn được chạy và khi phản hồi $ http thành công. Trình chặn yêu cầu được chạy sau khi phản hồi đã được trả về thành công. Điều này có vẻ hơi lạc hậu.

Tôi không thể sử dụng transformRequest vì tôi cần thay đổi các tham số trong cấu hình. Phần đó không được hiển thị trong mẫu.

Tôi đang sử dụng 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> 

Trả lời

7

Yêu cầu đánh chặn không chạy sau khi dữ liệu được trả về. Nó đang chạy trước đó. Hàm logIt của bạn chèn thông báo mới nhất ở trên cùng. Nếu bạn thay đổi mã của mình để sử dụng dịch vụ đăng nhập $, bạn sẽ thấy rằng trình chặn đánh chặn chạy đầu tiên.

+3

Wow ... cảm thấy câm bây giờ. Cảm ơn, mặc dù! Đã tìm ra mã khác của tôi rằng tôi đã sử dụng $ httpProvider.responseInterceptors không được chấp nhận thay vì $ httpProvider.interceptors. – skeemer

18

Nếu bạn muốn tùy chọn để chấp nhận/từ chối một yêu cầu vào thời điểm chặn bạn nên sử dụng $ httpProvider.responseInterceptors, xem ví dụ dưới đây:

$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 Không đọc bình luận của bạn, thực sự responseInterceptors bây giờ đã lỗi thời một đó là cách bạn làm điều đó thay vì:

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

tôi đã học được một cái gì đó hữu ích, nhờ

Các vấn đề liên quan