目前,我正在使用setInterval运行几个调用PHP页面的AJAX函数 -
var intervalOne = setInterval(ajaxfunction, 1500);
Run Code Online (Sandbox Code Playgroud)
这在具有微小响应时间的测试服务器上工作正常.然而,偶尔在我的实时服务器上,会有一些延迟,并且间隔时间将在第一个完成之前再次出现,重复相同的调用,并导致重复数据出现.
有没有办法保持相同的间隔时间,但如果第一个尚未完成,还等待调用该函数吗?
另外,有没有什么我可以放在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);
}
Run Code Online (Sandbox Code Playgroud)
简单的方法是setTimeout在流程结束时盲目地重新应用:
function foo() {
// possibly long task
setTimeout(foo, 1500);
}
foo();
Run Code Online (Sandbox Code Playgroud)
这将在您的进程之间等待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();
Run Code Online (Sandbox Code Playgroud)
是的,我想这些日子让它自我执行更受欢迎,正如你在一些答案中看到的那样; 但这只是美学,最终效果是一样的.
您可以替换setInterval()为setTimeout()在每个 AJAX 响应上不断重新安排:
function Send() {
//...
xmlhttp.onreadystatechange = function() {
if(xmlhttp.readyState == 4) {
setTimeout(Send, 1500);
//...
}
}
}
Send();
Run Code Online (Sandbox Code Playgroud)
如果您不需要毫秒精度,这很好(调用之间的时间将为 1500 毫秒 + 平均响应时间)。如果您需要每 1500 毫秒调用一次服务器,您可以从 1500 毫秒中减去响应时间。
| 归档时间: |
|
| 查看次数: |
11396 次 |
| 最近记录: |