【问题标题】:polling vs long polling轮询与长轮询
【发布时间】:2013-08-08 14:49:38
【问题描述】:

我使用了这些examples,显示了 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 });
})();

谢谢!

【问题讨论】:

    标签: javascript long-polling polling


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 客户端能区分长轮询和慢响应吗?在我看来,轮询和长轮询基本上是一回事。轮询:“客户端:准备好了吗?服务器:没有”。长轮询:“客户端:准备好了吗?服务器:……没有”。
    • @Davids:不同之处在于:通过轮询,客户询问并立即得到“是/或”的回答。使用长轮询时,客户端会询问但没有立即得到答复。直到有他可以回答的东西,服务器才会响应这个问题。所以这个问题一直悬而未决。
    • @Robert 如果发生超时事件并且服务器无法在长轮询中发送数据会发生什么?客户端是否应该再次发送相同的请求?
    • @SaurabhShah 没错,长轮询并不意味着你必须摆脱定期请求,如果你有空响应,再次向服务器询问信息是完全自然的
    • @Rob,为什么长轮询叫 long ?
    猜你喜欢
    • 1970-01-01
    • 2011-04-20
    • 2019-05-28
    • 1970-01-01
    • 2020-04-26
    • 2012-02-24
    • 2015-01-23
    • 1970-01-01
    • 2011-06-06
    相关资源
    最近更新 更多