我正在开发一个实现长轮询的应用程序,因为我希望用户在通知到达时立即收到通知。我有这部分工作,但我也需要扩展这与javascript函数发送一个"心跳"到服务器每20秒。
我的问题:我如何做到这一点,而不完全中断代码20秒(使其他javascript仍然执行,而它的计数),有没有办法使用第二个连接?因为我不希望当心跳发送给用户时,我的长轮询被中断。
任何想法?
虽然下面的线程相当旧,但它表明浏览器允许在任何时候通过XMLHttpRequest进行多个连接。
在流行的浏览器中允许多少并发AJAX (XmlHttpRequest)请求?如果您使用XMLHttpRequest或任何其他实现comet的方式有一个很长的轮询会话,您仍然可以创建另一个请求到同一服务器,作为setInterval或setTimeout函数的一部分,直到您达到浏览器施加的有限限制,您需要确保的是在XHR的构造中包含异步标志:
var heartbeatXhr = new XMLHttpRequest();
heartbeatXhr.open('GET', '/polling-url', true); // true for asynchronous
使用setInterval(yourHearbeatFunction, 20000)
,它不会锁定Javascript执行线程。因此,长轮询请求将在它到来时立即处理。
您不需要为要实现的目标维护多个连接。Javascript的异步特性允许连接在处理其他事情时保持活动状态。你可能认为javascript的XHR是阻塞的,因为它是单线程的。
javascript中的XHR是无阻塞的,因为事件循环模型——javascript引擎一直处于循环中,检查注册的调用是否已经完成,以及它的回调是否应该被处理。这使得它的操作是非阻塞的,从而允许一个javascript应用程序处理多个XHR长轮询请求。
如果您能够为请求使用jQuery,那么它可以很好地使用以下函数包装XHR: http://api.jquery.com/jQuery.ajax/。这样,您就可以定义一个20秒的超时并立即处理它(重新启动与服务器的连接)。
Aside -您可能希望考虑您的服务器堆栈来优化长轮询。确保你的web服务器不会为每个请求生成一个线程(像Apache 2.2)——否则你会很快耗尽系统资源!如果您可以使用node.js(它非常适合处理许多并发请求),请查看socket。IO库作为服务器端和客户端解决方案(http://socket.io/#home)。