【问题标题】:How long polling works轮询工作多长时间
【发布时间】:2013-03-30 22:09:28
【问题描述】:

我正在研究 ajax 长轮询,但我很困惑。传统的ajax调用和长轮询有什么不同

   var lpOnComplete = function(response) {
   alert(response);
   // do more processing
   lpStart();
  };

    var lpStart = function() {
    $.post('/path/to/script', {}, lpOnComplete, 'json');
    };

    $(document).ready(lpStart);

这个例子只是以递归方式调用服务器..与传统的 setInterval 调用不同..

【问题讨论】:

    标签: javascript jquery asp.net ajax


    【解决方案1】:

    顾名思义 Long Polling 意思是长时间轮询某事。

    $.post('/path/to/script', {}, lpOnComplete, 'json');
    

    这是实际过程的开始,您对服务器上的某个脚本进行 ajax 调用,在这种情况下是 /path/to/script ,您需要使您的服务器脚本(例如php)足够智能,以便它只当需要的数据可用时响应请求,脚本应等待指定的时间段(例如 1 分钟),如果在 1 分钟内没有可用数据,则它应该在没有数据的情况下返回。

    一旦服务器返回某些内容,在您的回调函数中,您再次对同一脚本进行 ajax 调用,服务器脚本再次继续该过程。

    考虑一个聊天应用程序,在传统方式中,您每 2 秒轮询一次服务器,即使没有可用消息,服务器也会返回。如果长达一分钟的服务器没有为您提供新消息,您最终会访问服务器 30最后一分钟的次数。

    现在考虑 Long Polling 方式,您将服务器脚本设置为等待一分钟以接收新消息。从客户端,您对脚本进行一次 ajax 调用,并说下一分钟没有消息到达,服务器将在 1 分钟之前响应。并且您在过去 1 分钟内只访问了服务器一次。你能想象 30 次命中与 1 次命中

    【讨论】:

    • hmmmm ......这很好,但这就像等待三十天在附近的村庄发生一些事件......虽然你可以回家并在 29 天后返回......哈哈。 ..虽然我喜欢你的解释完全有道理..
    【解决方案2】:

    理论上,使用 setinterval,您可以进行重叠处理,

    因此,如果一个 oncomplete 处理程序花费的时间特别长,它可能会与下一次调用重叠,从而减慢您的系统速度或以不可预知的方式解决。

    通过在第一个轮询完成后明确开始下一个轮询,您可以减少定期调用,其优势是您可以保证一次只作为一个工作单元作为副产品。

    【讨论】:

    • 长轮询的完成标准是什么??
    • 这里的真正推动力是什么。我认为并看到它仍然是拉..客户端正在启动并且拉服务器在没有客户端请求的情况下不会推送???
    • @AzamKhan 简单的回答是不能从服务器推送到 http 协议
    • @charlietfl 是的,这让我感到困惑..这个词令人困惑..当我看到它让我着迷..我可以这样做吗?真的..但是,我没有看到任何有价值的区别
    • @AzamKhan:堆栈溢出使用 WebSockets。
    【解决方案3】:

    长轮询有两种方式

    1. setInterval 技术
    设置间隔(函数(){ $.ajax({ 网址:“服务器”, 成功:函数(数据){ //更新您的仪表板仪表 salesGauge.setValue(data.value); }, 数据类型:“json” }); }, 30000);
    1. setTimeout 技术

    如果您发现自己处于要破坏间隔时间的情况,那么建议使用递归 setTimeout 模式:

    (函数轮询(){ 设置超时(函数(){ $.ajax({ url: "服务器", 成功: 函数(数据){ //更新您的仪表板仪表 salesGauge.setValue(data.value); //递归设置下一次轮询 轮询(); },数据类型:“json”}); }, 30000); })();

    使用闭包技术,poll 变成了一个自执行的 JavaScript 函数,第一次自动运行。设置三十 (30) 秒间隔。对您的服务器进行异步 Ajax 调用。然后,最后,递归地设置下一个轮询。

    【讨论】:

      【解决方案4】:

      通过长轮询,除非数据准备好,否则服务器不会返回,否则它会保持网络连接打开,直到数据准备好,在这个阶段它可以“推送”到客户端,因为客户端已经在等待。维基百科有一个很好的解释。 http://en.wikipedia.org/wiki/Long_polling#Long_polling。在您的示例中,lponcomplete 可能不会在几分钟内被调用。

      使用常量 settimeout 类型轮询意味着在您的第一个请求完成后立即准备好的数据在您的下一次轮询之前不会被传递,因为服务器与客户端没有连接。

      对于服务器来说,长轮询会使套接字长时间打开,占用资源,而重复的短轮询会导致更多的网络流量。

      Html5 有一些新的东西,比如 websockets 也可以在这个领域提供帮助,所以你可能也想了解一下。

      【讨论】:

      • 谢谢.. Html5 很乱.. 浏览器不完全兼容.. 我读了一点。一些关于微软新模型的信息,我不记得它的名字了。
      • 查看 socket.io,它是 websockets + 适用于不支持它的浏览器的 polyfill
      猜你喜欢
      • 2011-09-30
      • 2013-09-04
      • 2012-03-25
      • 1970-01-01
      • 2011-05-21
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多