2013-06-11 3 views
4

XMLHttpRequests를 수신하기 위해 ajax 호출 인터셉터를 만들었습니다.XMLHttpRequest에서 요청 헤더 수정하기

XHR의 요청 헤더를 수정하고 싶습니다. 웬일인지 XMLHttpRequest.send()에서 단지 그들을 바꿀 수있다. XMLHttpRequest.open()에서 수정하는 것이 초기입니까? 그것은 아래 코드에 붙여 넣은 예외를 throw합니다.

그럼 왜 오류가 발생합니까?

(function (open) { 

    XMLHttpRequest.prototype.open = function() { 

     this.setRequestHeader('foo', 'bar'); 
     // InvalidStateError: An attempt was made to 
     // use an object that is not, or is no longer, usable 

     open.apply(this, arguments); 
    }; 

})(XMLHttpRequest.prototype.open); 

(function (send) { 

    XMLHttpRequest.prototype.send = function() { 

     this.setRequestHeader('foo', 'bar'); // OK 

     send.apply(this, arguments); 
    }; 

})(XMLHttpRequest.prototype.send); 

for(var i = 0; i < 3; i++){ 

    var rnd = Math.round(Math.random()*3+1), 
     httpRequest = new XMLHttpRequest(); 

    httpRequest.onreadystatechange = function() { }; 
    httpRequest.open('GET', '/echo/json?delay=' + rnd); 
    httpRequest.send(); 

} 

http://jsfiddle.net/zrZ3a/2/

답변

12

당신이 바꿀 경우 :

this.setRequestHeader('foo', 'bar'); 
open.apply(this, arguments); 

는 얻을 :

open.apply(this, arguments); 
this.setRequestHeader('foo', 'bar'); 

는 그 다음 작동합니까?

+0

네, 그 이유를 설명해 주시겠습니까? – Johan

+2

설정하기 전에 열어야하기 때문에. – epascarello