24

我在这些示例中显示了 javascript 中的轮询与长轮询,但是我不明白它们之间有何不同。特别是关于长轮询示例,它如何保持连接打开?

这是传统轮询场景的样子:

(function poll(){
  setTimeout(function(){
    $.ajax({ url: "server", success: function(data){
      //Update your dashboard gauge
      salesGauge.setValue(data.value);

      //Setup the next poll recursively
      poll();
    }, dataType: "json"});
  }, 30000);
})();

这是长轮询示例:

(function poll(){
  $.ajax({ url: "server", success: function(data){
    //Update your dashboard gauge
    salesGauge.setValue(data.value);

  }, dataType: "json", complete: poll, timeout: 30000 });
})();

谢谢!

4

1 回答 1

49

不同之处在于:长轮询允许某种事件驱动的通知,因此服务器能够主动向客户端发送数据。可以说,正常轮询是对要获取的数据的定期检查。维基百科对此非常详细:

使用长轮询,客户端以类似于正常轮询的方式向服务器请求信息;但是,如果服务器没有任何可用于客户端的信息,则服务器不会发送空响应,而是保留请求并等待信息可用(或等待合适的超时事件),然后完成响应最后发给客户。

长轮询减少了需要发送的数据量,因为服务器只在真正有数据时才发送数据,因此客户端不需要在每个间隔 x 进行检查。

如果您需要一种更高效(并且更优雅)的全双工客户端/服务器通信方式,请考虑使用 WebSocket 协议,这很棒!

于 2013-08-07T09:42:17.923 回答