2

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

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

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

我知道 websockets,但由于它们还没有得到广泛的支持,我想坚持当前的技术。

4

4 回答 4

2

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

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

于 2013-08-26T23:56:36.997 回答
1

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

于 2013-08-26T23:58:38.813 回答
1

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

于 2013-08-26T23:58:54.273 回答
1

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

于 2013-08-27T00:02:46.863 回答