10

現在、setIntervalを使用して、PHPページを呼び出すいくつかのAJAX関数を実行しています-

var intervalOne = setInterval(ajaxfunction, 1500);

これは、応答時間が短いテスト サーバーでは問題なく動作します。ただし、私のライブサーバーでは、少しラグがあり、最初の呼び出しが完了する前に間隔時間が再び来て、同じ呼び出しが繰り返され、重複データが表示されることがあります。

同じ間隔時間を維持する方法はありますが、最初の関数がまだ終了していない場合は関数を呼び出すのを待つ必要がありますか?

あるいは、AJAX 呼び出しの readystate 部分に、呼び出しが完了したら再びトリガーするようにできるものはありますか?

編集 - 私の ajax 呼び出しの例:

function Send() {
var name = document.getElementById('name').value;
var message = document.getElementById('message').value;

var xmlhttp = getXMLHttp();

xmlhttp.onreadystatechange = function() {
    if(xmlhttp.readyState == 4)
    {
        document.getElementById('message').value = "";

        if(xmlhttp.responseText != "") {
            var chat = document.getElementById('messagebox');
            chat.innerHTML = chat.innerHTML + '<div class=\"alert\">' + xmlhttp.responseText + '</div>';
            chat.scrollTop = 1000000000;
        }
    }
}

xmlhttp.open("POST","submit_message.php",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("name=" + name + "&message=" + message);

}
4

3 に答える 3

12

setTimeout簡単な方法は、プロセスの最後にやみくもに再適用することです。

function foo() {
  // possibly long task
  setTimeout(foo, 1500);
}
foo();

これは、プロセス間で 1500 ミリ秒待機します。このように: 300ms プロセス、1500ms 待機、2000ms プロセス、1500ms 待機、400ms プロセス、1500ms 待機...

あなたが望むものにもう少し近づくと、プロセスsetTimeout最初に再申請することができます. この場合、次のようになります: 300 ミリ秒のプロセス、1200 ミリ秒の待機、2000 ミリ秒のプロセス、0 ミリ秒の待機、400 ミリ秒のプロセス、1100 ミリ秒の待機...で発生する問題はここでは発生しませsetIntervalん。将来のもの。また、JS はシングル スレッドであるため、他の言語のようにイベントが中断することはありません。

function foo() {
  setTimeout(foo, 1500);
  // possibly long task
}
foo();

そして、ええ、いくつかの回答でわかるように、最近では自己実行型にすることがより一般的になっていると思います。しかし、それは単なる美学であり、最終的な効果は同じです。

于 2012-06-16T12:07:00.953 に答える
4

すべての AJAX 応答で常に再スケジュールされるようにsetInterval()置き換えることができます。setTimeout()

function Send() {
    //...
    xmlhttp.onreadystatechange = function() {
        if(xmlhttp.readyState == 4) {
            setTimeout(Send, 1500);
            //...
        }
    }
}

Send();

ミリ秒単位の精度が必要ない場合は、これで問題ありません (呼び出し間の時間は 1500 ミリ秒 + 平均応答時間になります)。正確に 1500 ミリ秒ごとにサーバーを呼び出す必要がある場合は、1500 ミリ秒から応答時間を差し引くことができます。

于 2012-06-16T12:07:34.013 に答える
3

次のように、自己呼び出し関数を作成できますsetTimeout

(function foo(){

 // your code logic here

 setTimeout(foo, 5000);

})();

ここでの違いは、同じようsetIntervalに機能することですが、それとは異なり、関数の次の呼び出しは、パーツの実行が終了した後にのみyour code logic here実行されます。

ここでデモを参照してください。

于 2012-06-16T12:06:34.033 に答える