我正在一个函数中进行简单的聊天实现,该函数具有调用setTimeout的ajax调用,以便在成功时调用自身。每隔30秒左右运行一次。这样可以正常工作,但我希望在收到消息时立即通知。我看到很多用jQuery代码进行长轮询的例子看起来像这样:
function poll()
{
$.ajax(
{
data:{"foo":"bar"},
url:"webservice.do",
success:function(msg)
{
doSomething(msg);
},
complete:poll
});
}
我理解这是如何工作的,但这会不断重复向服务器发送请求。在我看来,服务器上需要有一些逻辑可以延迟,直到某些内容发生变化,否则会立即发回响应,即使没有新的报告。这是纯粹用javascript处理还是我错过了服务器端实现的东西?如果它是在服务器上处理的,暂停服务器执行真的是个好主意吗?在您的所有经验中,有什么更好的方法来处理这个问题?我的setTimeout()方法是否足够,可能只有一个较小的超时?
我知道websockets,但由于它们尚未被广泛支持,我想坚持当前的技术。
答案 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。