0

ロングポーリングの方法に関するビデオチュートリアルに従っていましたが、完了したようですが、何らかの理由で1つの問題があり、サーバーからの応答は1つですが、アラートが3〜6回表示されます。「成功」は、1回の応答が得られた場合にのみ発生すると考えていました。

2 番目の質問は、この JavaScript コードが 30 秒ごとに ajax 呼び出しをキャンセルして再起動するようにするにはどうすればよいですか? .abort() を使用して setInterval を配置しましたが、運が悪かったため、おそらく配置が間違っていました。

知恵と助けをありがとう!

var timestamp = null;
var imp = null;
var annk = null;
function waitForMsg(){
    $.ajax( 
    {  
        type: "GET",  
        url: "/test?timestamp=" + timestamp + "&imp=" +imp + "&annk=" +annk,
        dataType : 'json',  
        async: true,
        cache: false,
        success: function(data) 
        {
                            alert("hello");
                if(data.annkr > "0"){
                    $("#myidone").css("background-color", "#cccccc");
                }else{
                    $("#myidone").css("background-color", "#cccccc");
                }
                if(data.impr > 0){
                    $("#myidtwo").css("background-color", "#000000");
                }else{
                    $("#myidtwo").css("background-color", "#000000");
                }
            annk = data.annkr;
            imp = data.impr;
            timestamp = data.timestamp;
            setTimeout('waitForMsg()',2000);    
        }
    });
}   

$(document).ready(function(){
    waitForMsg();
});

ReadyStates に関する Stackoverflow の記事を読みましたが、一度だけ準備ができていることを確認し、準備ができた後にそれを行うにはどうすればよいですか?

4

3 に答える 3

0

実際には、setTimeout の代わりに setInterval を使用する必要があります。このアプローチを使用すると、ajax 呼び出しが失敗した場合にループが強制的に中止されます。

また、ネットワーク リソースの健全性のために、サービスの使用状況に応じて、タイムアウトのタイミングをキャンセルまたは変更することもできます。

于 2013-08-22T17:10:35.390 に答える
0

成功関数の setTimeout() が原因でアラートが複数回表示される場合があります。waitForMsg() 関数を呼び出し続けます。推測です。

リクエストを中止するには、次のようにします。

var timer = null;
function waitForMessage() {
  var req = $.ajax(YOUR_CODE);

  // The 30 second timeout
  timer = setTimeout(function() {
    req.abort();
    waitForMessage();
  }, 30000);
}

または少し良いかもしれません:

function waitForMsg() {
  $.ajax({
    timeout: 30000,
    error: function(err) {
      if(err === 'timeout') {
        waitForMsg();
      }
    }
  })
}
于 2013-08-22T17:08:36.617 に答える