2012-02-06 17 views
6

Próbuję wprowadzić długi polling za pomocą Netty i jQuery.Long Polling - Problemy z programem Internet Explorer 8

Mam to poprawnie działa z Chrome i Firefox, ale Internet Explorer 8 powoduje mi problemy.

Wykonuję następujący kod, który wysyła żądanie do mojego serwera, czeka aż odpowiedź zostanie odebrana z serwera, a następnie wysyła kolejne żądanie.

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

Jednakże w IE8 biegnę w nieskończoną pętlę, która jest zamrażanie przeglądarkę. Ciekawe jest to, że mój serwer otrzymuje tylko pierwszą prośbę z IE. Naprawdę jestem zdziwiony, co się dzieje. Jeśli ktokolwiek ma jakieś pomysły, byłbym wdzięczny za pomoc.

+1

Pierwszą linią powinna być 'function longPollRequest() {'. Czy to tylko literówka w twoim poście? – Jacob

+3

Założę się, że IE8 buforuje twoją prośbę: Wypróbuj 'url: '/ test-path? Nocache =' + (Math.random * 900000 + 100000) .toString() –

+0

@Jocob Ya to był tylko literówka. Naprawiony. –

Odpowiedz

9

Wyłącz buforowanie i sprawdzić, czy to rozwiązuje problem:

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

To zmusi jQuery dołączyć czasu i daty na każde żądanie. Jeśli odpowiedź zostanie zapisana w pamięci podręcznej, nastąpi bardzo szybko i istnieje duża szansa, że ​​przyczyną jest nieskończona pętla.

Można także wymusić minimalne opóźnienie między żądań 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); 
     } 
    }); 
} 

ten sprawdza aktualną godzinę przed czasie ostatniego żądania AJAX. Jeśli jest to więcej niż jedna sekunda, po prostu uruchom funkcję ponownie bez opóźnienia, w przeciwnym razie spraw, aby kod czekał, aż minie sekunda między żądaniami. Istnieje prawdopodobnie bardziej elegancki sposób definiowania zmiennej delay, ale powyższy kod powinien zacząć.

+3

Niesamowite, twoje rozwiązanie działa. Dzięki za wskazanie mi właściwego kierunku. Skończyło się na tym, że określiłem nagłówek odpowiedzi Cache-Control: brak bufora cache dla wszystkich odpowiedzi z długim odpytywaniem i działa on również. –