长轮询:我如何冷静下来?

时间:2013-08-26 23:53:39

标签: javascript jquery ajax long-polling

我正在一个函数中进行简单的聊天实现,该函数具有调用setTimeout的ajax调用,以便在成功时调用自身。每隔30秒左右运行一次。这样可以正常工作,但我希望在收到消息时立即通知。我看到很多用jQuery代码进行长轮询的例子看起来像这样:

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

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

我知道websockets,但由于它们尚未被广泛支持,我想坚持当前的技术。

4 个答案:

答案 0 :(得分:2)

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

使用客户端来管理暂停时间,就像使用setTimeout但延迟较低

一样

答案 1 :(得分:1)

你错过了“长轮询”中的部分。服务器上有责任不返回,除非有一些有趣的话要说。有关详细讨论,请参阅this article

答案 2 :(得分:1)

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

答案 3 :(得分:1)

没有正确的方法可以通过传统的ajax轮询在javascript端处理这个问题,因为如果你想要限制正在发出的请求数量,你将总是在一端或另一端有延迟。看看基于nodeJS的解决方案,或者甚至可以查看基于PHP的Ajax Push Engine www.ape-project.org。