2010-12-09 3 views
0

정보를 위해 지정된 서브넷 주소를 쿼리하는 Windows 가젯 ("브라우저"가 Internet Explorer임을 의미)에서 작업했습니다. 이제는 때로는 비교적 빠른 속도 (약 5 초마다)로이를 수행하며 충분히 잘 작동합니다. 그러나 때로는 준비 상태 1에서 멈추고 영원히 거기에 머무를 것입니다. 가젯이 xmlhttprequest를 가져 오는 기능을 다시 실행하고 정보를 가져올 때마다 상태 1에 머물러 있습니다. 가젯의 여러 인스턴스를 열고 그 중 하나를 제외하고 모두 닫으면 쉽게 복제 할 수 있습니다. 이 시점에서 아직 열려있는 상태는 거의 항상이 상태에 머물러있게됩니다. 같은 웹 사이트에 액세스하는 모든 사람들과 관련이 있거나, 중간 전송이 중지 된 xmlhttprequests와 다른 작업을 방해하는 xmlhttprequests와 관련이있을 수 있습니다. 아래는 관련 코드입니다.Javascript : xmlhttprequest가 준비 상태 1에서 임의로 멈춤

//Reference to this for the inner function 
var me = this; 
var request = new XMLHttpRequest(); 
request.onreadystatechange = onReadyStateChange; 
var url = this.url; 
//Make the URL random to prevent being cached 
url += ("&a=" + ((new Date()).getTime())); 
Trace(DEBUG_COMM, "Sase.updateStatus url: " + url); 
request.open("GET", url, true); 
request.send(); // fire off the request, calls httpRequestReadyStateChange as things continue 
Trace(DEBUG_COMM, "Request sent" + request.readyState); 
function onReadyStateChange() {Trace(DEBUG_COMM, "Sase.httpRequestReadyStateChange: state=" + request.readyState); 
    if (4 == request.readyState) { 
     Trace(DEBUG_COMM, "Sase.httpRequestReadyStateChange: status=" + request.status); 

     if (request.status == 200) { 
      Trace(DEBUG_COMM, "retrieved html: " + request.responseText); 
      var results = request.responseText; 
      var resultsString = request.responseText.toString(); 
      Trace(DEBUG_COMM, "results String: " + resultsString); 
      me.ParseStatusData(resultsString); 
     } 
     else { 
      //me.commError(request.status); 
     } 

     request = null; 
    } 
} 

답변

1

글쎄, 내가 알아 낸 것처럼 보입니다. 나는 그 요청이 미해결 된 요청이라고 느꼈습니다. 그 인스턴스가 닫힐 때만 발생합니다. 즉, 서버 중 하나가 닫혀 있으면 서버가 통신에 영원히 머무르고 아무도 다른 서버에 액세스 할 수 없음을 의미합니다. 그것은 사실 인 것처럼 보입니다. 여러 영역에서 코드를 수정했으며 기본적으로 가젯이 닫히면 모든 요청을 중단합니다. 요청은 이제 인스턴스 변수이므로 (중단을 허용하기 위해) 필요할 때마다 새로운 요청이 생성됩니다.

+1

이 어떻게 수정 사항을 게시하고이에게 가치있는 답을 만들기에 대해 어떻게 생각하세요 :이처럼 사용할 수 있습니다

//Declare the XMLHttpRequest object to be re-used var global_xHttpRequest = null; function xmlHttpHandler(type, params, complete, postData) { //Prevents an issue where previous requests get stuck and new ones then fail if (global_xHttpRequest == null) { global_xHttpRequest = new XMLHttpRequest(); } else { global_xHttpRequest.abort(); } //Parse out current URL var baseURL = window.location.host; var svc = "https://" + baseURL + "/processAction?"; var url = svc + params; global_xHttpRequest.open(type, url, true); //Add the callback global_xHttpRequest.onreadystatechange = complete; global_xHttpRequest.send(postData); } 

? –

+1

거의 3 년 동안이 코드에 액세스 할 수 없었기 때문에 상당히 불안했습니다. – user535617

0

여기에 비틀 거려서 구체적인 코드 예가 ​​필요한 사람들을 위해 여기에 나와 있습니다.

동일한 문제가 있었으며 솔루션은 XMLHttpRequest 객체를 다시 사용하여 이전 요청이 새 요청을 시작하기 전에 취소되었는지 확인했습니다. 여러 개의 AJAX 요청을 여러 번 보내고 싶다면이 방법은 효과가 없을 것입니다. 그러나 새로운 요청을 트리거하는 나의 경우에는 마지막 요청이 더 이상 필요하지 않습니다.

내 페이지의 모든 요청은 이와 같이 보이는 동일한 XMLHttpRequest 래퍼 메서드를 통과했습니다.

xmlHttpHandler("GET", params, completeFnc); 
관련 문제