我最近接手了一个使用COMET执行一些协作工作并处理简单聊天室的项目。最初编写这个东西的人在STOMP和Oribited之上编写了一些类来处理所有实际的聊天,消息和日志记录。
问题在于,如果用户关闭窗口或导航到其他页面或因任何其他原因终止连接,则所有其他用户需要一段时间才能看到他已注销。其他用户必须等待退出用户的上次ping的时间戳超过一定的持续时间才能注册用户不再连接到系统。
我能想到的解决方案需要在用户已离开的onuload事件中发送通知,以便它可以通知所有其他用户而无需等待超时。这个问题是因为onunload会在连接完成之前立即终止连接。据我所知,这也是AJAX的一个问题。
现在,我还读到卸载中的同步请求会延迟窗口关闭/导航,直到请求完成。
所以,我的问题是这样的:有没有人知道在所选实例中临时使彗星请求同步的方法,以便在终止之前有时间完成请求?还是有另一种解决这个问题的方法,我没有想到的?谢谢你的帮助。
哦,同样,onbeforeunload将无法正常工作,因为如果它发送请求并且用户选择“否,我想留在此页面上”,它将已经通知其他用户他已退出聊天。< / p>
tl; dr:需要一种在Unload事件中成功触发COMET请求的方法。我们使用STOMP和Orbited作为COMET的东西。
答案 0 :(得分:1)
'onbeforeunload'函数仅在从其返回某个值时才会生成yes-no对话框。因此,您需要做的是在onbeforeunload函数中使用SYNCHRONOUS XMLHttpRequest(AJAX)请求而不返回任何内容。您必须将请求的异步标志设置为 false ,如下面显示的AJAX GET请求中所示: -
AJAXObject.open("GET", 'http://yourdomain/logout?somevar=something', false);
AJAXObject.send(null);
它将阻止浏览器关闭,直到请求完成,并且我记得,Opera不支持'onbeforeunload',因此它不适用于Opera。但它在IE,FF,Chrome上运行良好。
答案 1 :(得分:0)
如果您使用的是彗星,那么您应该控制服务器。彗星的想法是它不是对服务器的不断轮询。每个客户端都应该与服务器保持连接的开放连接。因此,当连接关闭时,服务器应该能够向其他客户端发送通知。