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

tec*_*jas 5 javascript jquery asynchronous

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

显而易见的开始是使用XMLHttpRequest对象或jQuery的$.ajax方法向服务器发送GETPOST请求异步请求某些数据.

但是,除了使用setInterval方法一次发送一个请求之外,30 seconds我不知道如何使连接到服务器持久化.基本上,我只想发送一个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>
Run Code Online (Sandbox Code Playgroud)

tec*_*jas 13

在网上搜索后,这是我一直在寻找这个问题的答案不使用 sockets.io也不WebSockets不会使用 jQuery利用其优势complete的方法来创建一个人工循环:

<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>
Run Code Online (Sandbox Code Playgroud)

来自Technoctave的Tian Davis:http://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery

  • @Reno,我总是想到成功.这就是乐观主义者所做的! (5认同)
  • 此外,一旦收到每个HTTP响应,就会调用`poll` - 没有延迟 - 所以代码肯定不符合你的非骚扰要求. (4认同)
  • 此代码似乎忽略了超时值,并疯狂地调用循环函数. (3认同)
  • 使用上面编写的代码,我认为如果发生超时,您会发现轮询周期将永久失败.您可能不希望如此,因此您需要采取措施确保其继续,例如.使用某种自定义超时机制而不是内置的"timeout:30000"方法. (2认同)
  • @ Beetroot-Beetroot即使在超时(错误)后也会发生完整的调用,你必须在这里考虑成功. (2认同)