2012-01-13 10 views
0

PHPとjQueryで長いポーリング(thisのようなもの)に基づいてチャットをしています。一度ページ全体がブラウザにダウンロードされると、関数はバックエンドに長いポーリング要求をいくつかのタイムアウト制限で作成します。データはバックエンドから来て、それは再び長いポーリング要求を行い、エラーがあれば新しい長いポーリング要求。jquery php longポーリングリクエストの問題

問題:Firebugでトレースを分析すると、長いポーリング要求が3回または4回実行されていることがわかりましたが、そうしてはいけません。ページごとに1つの長いポーリング要求が実行されます。

しかし、コードは完全に機能します。長いポーリング要求の重複が問題です。

function listen_for_message(){ 
// this functions is makes the long-polling request 
$.ajax({ 
    url: "listen.php", 
    timeout:5000, 
    success: function(data) { 
      $('#display').html(data); 
      listen_for_message(); 
      } 
    error: function() { 
      setTimeOut("listen_for_message()",2000); // if error then call the function after 2 sec 
    } 
    }); 
    return; 
} 
+2

長いポーリングを開始するコードを投稿できますか? – jabclab

+0

は、質問に含まれるコードを編集しました。 –

答えて

1

terminate requests manualyに試してみてください。

var connection; 
function longpoll() { 
    if(connection != undefined) { 
     connection.abort(); 
    } 

    connection = $.ajax({ 
     ... 
     complete: function() { 
      longpool(); 
     } 
    }); 
} 

また、Chromeでそれをテスト、(ランニングとして中止されまし接続を示す)のFirefox/Firebugの問題かもしれません。

UPDATE:

「Firefoxので3.0+のみ、スクリプトとJSONPリクエストがタイムアウトによってキャンセルすることはできません。それは、タイムアウト期間後に到着した場合、スクリプトでも実行されます。」 http://api.jquery.com/jQuery.ajax/

+0

良い提案私はクロムをチェックさせてください –

+0

コードでは、コードが、要求が実行されている場合は、関数が呼び出される関数が呼び出されるかどうかをチェックするようなコードで行う方法はありますか? –

+0

_connection_変数をフラグとして使用して、Ajaxリクエストが実行中かどうかを確認し、新しいAjaxリクエストを作成できないかどうかを確認することができます。 'complete ='関数では 'connection = undefined;'を、 'connection!= undefined'ならば' longpoll'関数の先頭で 'r​​eturn'をセットするだけです。 –