【问题标题】:Long Polling: How do I calm it down?长轮询:我如何让它平静下来?
【发布时间】:2013-08-26 23:53:38
【问题描述】:

我正在一个函数中实现一个简单的聊天实现,该函数有一个 ajax 调用,该调用调用 setTimeout 以在成功时调用自身。这每 30 秒左右运行一次。这很好用,但我希望在收到消息时得到更直接的通知。我看到很多使用 jQuery 代码进行长轮询的示例,看起来像这样:

function poll()
{
    $.ajax(
    {
        data:{"foo":"bar"},
        url:"webservice.do",
        success:function(msg)
        {
           doSomething(msg);
        },
        complete:poll
    });
}

我了解它的工作原理,但这只会立即重复向服务器发送请求。在我看来,服务器上需要一些逻辑,直到某些事情发生变化,否则即使没有新的报告,也会立即发回响应。这是纯粹用javascript处理的还是我错过了要在服务器端实现的东西?如果它是在服务器上处理的,那么暂停服务器执行真的是个好主意吗?根据您的所有经验,有什么更好的方法来处理这个问题?我的 setTimeout() 方法是否足够,也许只是更小的超时?

我了解 websocket,但由于它们尚未得到广泛支持,我想坚持使用当前技术。

【问题讨论】:

  • 谢谢大家。我一直在寻找与框架无关的一般概念的良好讨论,你们都提供了一些很好的反馈。在我看来,这只是衡量增加的流量是否值得更快响应的问题。就我而言,看起来 setTimeout 是最好的折衷方案。

标签: javascript jquery ajax long-polling


【解决方案1】:

不要暂停服务器执行...如果很多人尝试聊天会导致服务器资源枯竭...

使用客户端管理暂停时间,就像使用 setTimeout 一样,但延迟更低

【讨论】:

    【解决方案2】:

    您错过了“长轮询”中的 long 部分。除非有有趣的事情要说,否则服务器有责任不返回。更多讨论请见this article。

    【讨论】:

      【解决方案3】:

      您已经确定了权衡,打开与 Web 服务器的连接,因此消耗 http 连接(即响应必须阻止服务器端)与频繁的“有什么新的”请求因此消耗带宽。如果您的浏览器基础可以支持 WebSockets 可能是一种选择(大多数“现代”浏览器 http://caniuse.com/websockets)

      【讨论】:

        【解决方案4】:

        没有适当的方法可以通过传统的 ajax 轮询在 javascript 端处理此问题,因为如果您希望限制发出的请求数量,您总是会在一端或另一端出现延迟。查看基于 nodeJS 的解决方案,或者甚至查看基于 PHP 的 Ajax 推送引擎 www.ape-project.org。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-25
          • 2012-06-08
          • 2012-03-25
          • 1970-01-01
          • 2014-08-10
          • 2013-08-08
          • 2016-10-21
          • 2011-04-20
          相关资源
          最近更新 更多