gpt4 book ai didi

javascript COMET 请求 onunload

转载 作者:行者123 更新时间:2023-11-30 06:04:37 25 4
gpt4 key购买 nike

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

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

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

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

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

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

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

最佳答案

“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 上运行良好。

关于javascript COMET 请求 onunload,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5900868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com