民意调查与长期民意调查

时间:2013-08-07 09:33:12

标签: javascript long-polling polling

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

这就是传统的投票方案:

(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 });
})();

谢谢!

2 个答案:

答案 0 :(得分:19)

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

通过长轮询,客户端以类似于正常轮询的方式从服务器请求信息;但是,如果服务器没有任何可用于客户端的信息,那么服务器不会发送空响应,而是保留请求并等待信息变为可用(或者对于合适的超时事件),之后完整的响应是终于送到了客户端。

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

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

答案 1 :(得分:2)

对于轮询,客户端通常会以固定的间隔从服务器请求数据,并且服务器将以最新状态响应或根本不响应。轮询的主要问题是客户端不知道何时请求数据。这通常会导致对数据的请求,该数据自上次请求以来实际上并未真正更改过,或者在初始更改后过一会儿才请求数据。两种情况都不理想。

对于long polling,请求会像轮询中一样发送到服务器,但是不会立即收到响应。而是,服务器可以等待数据已更改,然后发送响应。这样既可以确保不会不必要地发送请求,也可以确保客户端在更改后尽快获取数据。