2012-02-06 4 views
6

Netty 및 jQuery를 사용하여 긴 폴링을 구현하려고합니다.긴 폴링 - Internet Explorer 8의 문제점

Chrome과 Firefox에서 제대로 작동하지만 Internet Explorer 8에서 문제가 발생합니다.

다음 코드를 실행하여 내 서버에 요청을 보내고 서버에서 응답을받은 다음 다른 요청을 보낼 때까지 기다립니다.

function longPollRequest() { 
    $.ajax({ 
     url: '/test-path', 
     type: 'GET', 
     success: function(data, textStatus, jqXHR) { 
      longPollRequest(); 
      console.log('Received: ' + data); 
     } 
    }); 
} 

그러나 IE8에서는 브라우저를 정지시키는 무한 루프가 발생합니다. 흥미로운 부분은 내 서버가 IE의 첫 번째 요청 만 수신한다는 것입니다. 무슨 일이 일어나고 있는지에 대해 나는 당황 스럽다. 누구든지 아이디어가 있다면 정말 도움을 주시면 감사하겠습니다.

+1

첫 번째 행은'function longPollRequest() {'이어야합니다. 귀하의 게시물에 오타가 있습니까? – Jacob

+3

IE8이 요청을 캐시했는지 확인해보십시오. 'url :'/ test-path? nocache = '+ (Math.random * 900000 + 100000) .toString() –

+0

@Jocob Ya는 오타였습니다. 결정된. –

답변

9

안 캐싱 및 그 문제가 해결되는지 확인 :

function longPollRequest() { 
    $.ajax({ 
     url  : '/test-path', 
     type : 'GET', 
     cache : false, 
     success : function(data, textStatus, jqXHR) { 
      longPollRequest(); 
      console.log('Received: ' + data); 
     } 
    }); 
} 

이 각 요청에 타임 스탬프를 추가 jQuery를 강제 할 것이다. 응답이 캐싱되면 매우 빠르게 반환되고 무한 루프의 원인이 될 수있는 좋은 기회가 있습니다.

또한 AJAX 요청 사이의 최소 지연을 강제 할 수 :

var lastRequestTime = 0; 
function longPollRequest() { 
    $.ajax({ 
     url  : '/test-path', 
     type : 'GET', 
     cache : false, 
     success : function(data, textStatus, jqXHR) { 
      var delay = ((new Date().getTime()) - lastRequestTime); 
      if (delay > 1000) { 
       delay = 0; 
      } else { 
       delay = (1000 - delay); 
      } 
      setTimeout(longPollRequest, delay); 
      console.log('Received: ' + data); 
     } 
    }); 
} 

이 마지막 AJAX 요청의 시간에 대한 현재 시간을 확인합니다. 1 초 이상이되면 지연없이 함수를 다시 실행하십시오. 그렇지 않으면 두 번째 요청 사이에 코드가 사라질 때까지 코드를 대기 시키십시오. delay 변수를 정의하는 좀 더 우아한 방법이 있지만 위의 코드를 시작해야합니다.

+3

굉장합니다. 당신의 솔루션이 효과가 있습니다. 나를 올바른 방향으로 가리켜 주셔서 감사합니다. 모든 긴 폴링 응답에 대해 Cache-Control : no-cache 응답 헤더를 지정하는 결과가 발생했습니다. –

관련 문제