javascript - 等待函数完成的 setInterval 的替代方法

标签 javascript ajax

目前,我正在使用 setInterval 来运行几个像这样调用 PHP 页面的 AJAX 函数 -

var intervalOne = setInterval(ajaxfunction, 1500);

这在响应时间很短的测试服务器上运行良好。但是偶尔在我的live server上,会有点卡顿,interval time会在第一个还没有结束的时候又来,重复同样的调用,导致出现重复的数据。

有没有办法保持相同的间隔时间,但如果第一个还没有完成,让它等待调用函数?

或者,我可以在 AJAX 调用的就绪状态部分放入什么,让它们在完成后再次触发吗?

编辑 - 我的一个 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);

}

最佳答案

最简单的方法是在流程结束时盲目地重新应用 setTimeout:

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

这将在您的进程之间等待 1500 毫秒。像这样:300ms 进程,1500ms 等待,2000ms 进程,1500ms 等待,400ms 进程,1500ms 等待...

为了更贴近您的需要,您可以在进程的开始 处重新应用setTimeout。在这种情况下,你会得到:300ms process, 1200ms wait, 2000ms process, 0ms wait, 400ms process, 1100ms wait... setInterval 发生的问题在这里不会发生,因为这个仅安排 迭代,而不是所有 future 的迭代。另请注意,由于 JS 是单线程的,因此事件不能像在某些其他语言中那样中断自身。

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

是的,我想现在更流行让它自动执行,正如您在一些答案中看到的那样;但这只是美学,最终效果是一样的。

关于javascript - 等待函数完成的 setInterval 的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11063242/

相关文章:

javascript - :的扫描码是什么

javascript - javascript中的数学到svg坐标转换

javascript - 黑名单 React 组件

ruby-on-rails - 如何使用 RSpec/RoR 测试 AJAX 请求?

jquery - SignalR 是否适合替代 jQuery Ajax(或类似的)

javascript - 如何在div中定位div?

javascript - 使用 javascript 在 cookie 中创建数组

php - 使用 PHP 将 Ajax POST 数据保存到文件

javascript - 我的 jQuery Ajax 有什么问题?

asp.net - DropdownList 重置在更新面板的提交按钮上不起作用