我正在开发一个实现长轮询的应用程序,因为我希望用户在收到通知后立即收到通知。我有这部分工作,但我还需要使用 javascript 函数对其进行扩展,该函数每 20 秒向服务器发送一次“心跳”。
我的问题:如何在不完全中断代码 20 秒的情况下执行此操作(以便在计数时仍执行其他 javascript),有没有办法为此使用第二个连接?因为我不希望在向用户发送心跳时中断我的长轮询。
有任何想法吗?
我正在开发一个实现长轮询的应用程序,因为我希望用户在收到通知后立即收到通知。我有这部分工作,但我还需要使用 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 执行线程。因此,longpolled 请求将在它到来时立即处理。
您不需要为要实现的目标维护多个连接。Javascript 的异步特性允许连接在处理其他事情时保持活动状态。您可能认为 javascript 的 XHR 是阻塞的,因为它是单线程的。
由于事件循环模型,javascript 中的 XHR 是非阻塞的 - javascript 引擎不断处于循环中,检查注册调用是否已完成以及是否应处理其回调。这允许其操作是非阻塞的,从而允许单个 javascript 应用程序处理多个 XHR 长轮询请求。
如果您能够使用 jQuery 来处理请求,它会用这个函数很好地包装 XHR:http: //api.jquery.com/jQuery.ajax/。有了这个,您可以定义 20 秒的超时并立即处理它(以重新启动与服务器的连接)。
另外 - 您可能希望考虑您的服务器堆栈以优化长轮询。确保您的 Web 服务器不会为每个请求生成一个线程(如 Apache 2.2) - 否则您将很快耗尽系统资源!如果您可以使用 node.js(它非常适合处理许多同时请求),请查看 socket.io 库作为服务器端和客户端解决方案(http://socket.io/#home)。