2012-02-06 16 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秒以上であれば、遅れなく関数を再実行します。それ以外の場合は、コードが1秒間に要求を待つまで待ちます。おそらくdelay変数を定義するより洗練された方法がありますが、上記のコードはあなたを始めるはずです。

+3

あなたの解決策は素晴らしいです。正しい方向に私を指してくれてありがとう。私は、すべてのロング・ポーリング応答に対してCache-Control:no-cacheレスポンス・ヘッダーを指定してしまいました。 –

関連する問題