使用JavaScript和jQuery的简单长轮询示例

使用JavaScript和jQuery的简单长轮询示例,javascript,jquery,asynchronous,Javascript,Jquery,Asynchronous,我正在尝试创建一个实时网站分析仪表板,该仪表板使用jQuery/JavaScript异步创建到服务器的开放HTTP连接,以便在数据更新时轮询服务器 显然,这样做的开始是使用XMLHttpRequest对象或jQuery的$.ajax方法向服务器异步发送GET或POST请求,请求一些数据 但是,除了每隔30秒使用setInterval方法一次发送一个请求之外,我不知道如何保持与服务器的连接。基本上,我只想发送一个http请求,并确保与服务器的连接保持打开状态以进行轮询 我使用setInterval

我正在尝试创建一个实时网站分析仪表板,该仪表板使用jQuery/JavaScript异步创建到服务器的开放HTTP连接,以便在数据更新时轮询服务器

显然,这样做的开始是使用
XMLHttpRequest
对象或jQuery的
$.ajax
方法向服务器异步发送
GET
POST
请求,请求一些数据

但是,除了每隔
30秒使用
setInterval
方法一次发送一个请求之外,我不知道如何保持与服务器的连接。基本上,我只想发送一个http请求,并确保与服务器的连接保持打开状态以进行轮询

我使用
setInterval
的示例代码如下:

<div id="analytics"></div>
<script>
var analytics = document.getElementById('analytics');
setInterval(function(){
    $.ajax({ url: "http://server.com/", success: function(data){
        analytics.innerHTML = data;
    }, dataType: "json"});
}, 30000);
</script>

var analytics=document.getElementById('analytics');
setInterval(函数(){
$.ajax({url:http://server.com/,成功:函数(数据){
analytics.innerHTML=数据;
},数据类型:“json”});
}, 30000);

在网上搜索后,这就是我正在寻找的答案,没有使用
套接字。io
也没有
WebSockets
,但是通过利用其
complete
方法创建人工循环,使用了
jQuery

<div id="analytics"></div>
<script>
var analytics = document.getElementById('analytics');
(function poll(){
    $.ajax({ url: "server", success: function(data){
        analytics.innerHTML = data;
    }, dataType: "json", complete: poll, timeout: 30000 });
})();
</script>

var analytics=document.getElementById('analytics');
(函数poll(){
$.ajax({url:“服务器”,成功:函数(数据){
analytics.innerHTML=数据;
},数据类型:“json”,完成:轮询,超时:30000});
})();

来源是Technoctave的Tian Davis:

您有什么理由只需要发送一个http请求吗?如果你想要一个持久性连接,你可能需要查看WebSocket。http不起作用。我想我想要持久性的两个原因是:(1)它可以确保我的更新更实时;(2)我认为它的性能更好,即减少了多个请求对服务器的冲击?@technojas,正如charlietfl所说,http不像tcp连接等,它也不是这样工作的。如果必须有真正的连接,请使用WebSocket。另一方面,我不认为频繁发送ajax请求有什么错,尤其是每30秒发送一次。如果要进行长时间轮询,则需要特别注意服务器端(非阻塞I/o),查看socket.io,或使用上面编写的代码研究服务器的comet项目,我想你会发现,如果超时,投票周期将永久失败。您可能不希望这样,因此需要采取措施确保它继续,例如,使用某种自定义超时机制,而不是内置的
timeout:30000
方法。此外,
poll
将在收到每个HTTP响应后立即调用-无延迟-因此代码肯定不符合您的非抖动要求。@Beetroot Beetroot即使在超时(错误)后也会进行完整调用,您一定在考虑成功。@Reno,我一直在考虑成功。乐观主义者就是这么做的!这段代码似乎忽略了超时值,疯狂地调用循环函数。