1

我写了一个网络论坛,它也可以用作同步聊天客户端(帖子会立即出现)。这通过使用单个长轮询 ajax 请求(有时称为“comet”)以通常的方式工作。

当用户关闭其中加载了其中一个“聊天室”的选项卡时,我需要告诉服务器该用户正在离开房间,以便将他们从“正在查看的用户”列表中删除,并确保新的离开后到达的帖子被标记为未读。

现在我正在使用一个同步 ajax(open() 的第三个参数为 false)请求 window.onbeforeunload 处理程序中的服务器。它通常会在 < 2 秒内返回,因此对可用性几乎没有影响。

现在解决问题。假设该用户已经打开了 5 个以上的标签,其中包含托管在同一域上的聊天室。然后他们关闭一个。浏览器每个域值的最大同时 http 请求启动,并使“我要离开”同步 ajax 请求等待其他请求之一完成,但这些请求可能永远不会完成,因为它们是彗星(“长轮询”或其他) . 所以现在我已经有效地锁定了他们试图关闭的标签。

如果 javascript 不是单线程的,那么明显的解决方案是同步 ajax 请求的短暂超时。

4

0 回答 0