【问题标题】:javascript COMET request onunloadjavascript COMET 请求 onunload
【发布时间】:2011-05-05 16:07:29
【问题描述】:

我最近接手了一个项目,该项目使用 COMET 执行一些协作工作并处理一个简单的聊天室。最初编写这个东西的人在 STOMP 和 Oribited 之上组成了一些类来处理所有实际的聊天、消息传递和日志记录。

问题在于,如果用户关闭窗口或导航到不同的页面或出于任何其他原因终止连接,所有其他用户需要一段时间才能看到他已注销。其他用户必须等待退出用户的最后一次 ping 的时间戳超过一定的持续时间,然后才能注册该用户不再连接到系统。

我能想到的解决方案需要在用户离开的 onuload 事件中发送通知,这样它就可以通知所有其他用户而无需等待超时。这样做的问题是,因为 onunload 将在连接完成之前立即终止连接。据我了解,这也是 AJAX 的问题。

现在,我还了解到卸载中的同步请求会延迟窗口关闭/导航,直到请求完成。

所以,我的问题是:有没有人知道在选定实例中临时使彗星请求同步的方法,以便在终止之前有时间完成请求?还是有另一种我没有想到的方法来解决这个问题?感谢您的帮助。

哦,另外,onbeforeunload 也不起作用,因为如果它发送请求并且用户选择“不,我想留在这个页面上”,它已经通知其他用户他已经退出了聊天。

tl;dr:需要一种在 Unload 事件中成功触发 COMET 请求的方法。我们将 STOMP 和 Orbited 用于 COMET。

【问题讨论】:

    标签: javascript ajax comet synchronous


    【解决方案1】:

    “onbeforeunload”函数仅在从它返回某个值时才会生成一个是-否对话框。因此,您要做的是在 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 上运行良好。

    【讨论】:

      【解决方案2】:

      如果你使用comet,那么你应该控制服务器。彗星的想法是它不是对服务器的持续轮询。每个客户端都应该与服务器保持持续的开放连接。因此,当连接关闭时,服务器应该能够向其他客户端发送通知。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-12
        • 1970-01-01
        • 2010-10-29
        • 1970-01-01
        • 2010-10-27
        • 2011-04-16
        • 1970-01-01
        相关资源
        最近更新 更多