长轮询如何工作javascript?

Ras*_*mus 14 javascript jquery long-polling

嗨我明白,在长轮询中你保持与服务器的连接打开很长时间,直到你从服务器得到一个响应,然后再次轮询并等待下一个响应.但是,我似乎不明白如何编码它.下面有这个代码使用长轮询,但我似乎没有得到它

(function poll(){
$.ajax({ url: "server", success: function(data){
   //update page based on data

}, dataType: "json", complete: poll, timeout: 30000 });
})();
Run Code Online (Sandbox Code Playgroud)

但是这里的连接如何保持开放.我知道一旦获得服务器的响应,就会再次触发"poll"功能.但是如何保持连接打开?

编辑1: - 如果有人也可以解释这里实际超时的情况,那将会很棒

dec*_*eze 13

客户端无法强制服务器保持连接打开.该服务器根本就没有关闭连接.服务器必须在某个时候说"就是这样,这里没有更多的内容,再见".在长轮询中,服务器根本不会这样做,并让客户端等待更多数据,随着更新的进行,它会逐渐涓涓细流.这是长时间的轮询.

在客户端,可以在请求尚未完成时偶尔检查已经收到的数据.这样,有时可以通过相同的开放连接从服务器发送数据.在您的情况下,这没有完成,success回调只会在请求完成时触发.它基本上是一种廉价的长轮询形式,服务器使客户端等待事件,发送有关此事件的数据,然后关闭连接.客户端将其作为触发器,处理数据,然后重新连接到服务器以等待下一个事件.


Bra*_*don 9

我认为令人困惑的是,讨论主要集中在客户端编程上.

长轮询不是严格的客户端模式,但需要Web服务器保持连接打开.

背景:当某些事情发生或可用时,客户希望通过Web服务器得到通知,例如,让我知道新电子邮件何时到达,而我不必每隔几秒就回来询问一次.

  1. 客户端打开与Web服务器上特定URL的连接.
  2. 服务器接受连接,打开套接字并将控制权分派给处理此连接的任何服务器端代码(比如java中的servlet或jsp,或者RoR或node/express中的路由).
  3. 服务器代码一直等到事件或信息可用.例如,当电子邮件到达时,查看是否有任何"等待连接"用于特定收件箱.如果是,则使用适当的数据进行回复.
  4. 客户端接收数据,执行其操作,然后启动另一个轮询请求.