【发布时间】:2018-08-10 10:54:33
【问题描述】:
我有一个网站,我只希望客户端一次能够有 1 个 WebSocket 连接(当他们打开另一个选项卡而已经有另一个连接显示时,我会向他们显示一个错误)。
我正在开发一个客户端解决方案,当请求连接时,我将本地存储中的标志更新为真(如果标志已经为真,则不会请求)然后我监听 beforeunload 事件如果该选项卡具有打开的连接,则将本地存储标志设置为 false。
这似乎工作得很好,除了当用户突然关闭他们的计算机并且因此 beforeunload 永远不会触发的边缘情况,所以当他们重新打开他们的计算机时,本地存储标志卡在 true 并且他们没有卡住能够在任何选项卡中连接。
是否有在关机前调用的事件,我可以将本地存储标志设置为 false?
如果没有,客户端是否有另一种解决方案来跟踪它在所有选项卡中只有 1 个 WebSocket 连接,以便如果已经有一个连接,它可以阻止连接?
window.addEventListener('beforeunload', this.setFlagToFalse);
【问题讨论】:
-
没有。没有电源的计算机无法在该计算机上的浏览器中触发事件 - 您需要更智能的服务器端
-
我知道服务器端是理想的解决方案,但是对于这个用例,它不是关键任务,我想要一个客户端解决方案。我想要的只是一次打开 1 个 websocket 连接(如果 websocket 连接,则不要连接),我认为必须离开才能实现这个客户端,除了这个单一的边缘情况外,我的解决方案效果很好.
-
也许您应该尝试了解 chrome 如何发现它从崩溃中恢复(或您提到的完全相同的情况)并为用户提供
restore tabs的选项。不知道其他浏览器也是如此。 PS:也许标志应该是您的 websocket 连接&在这种情况下您应该尝试重用它。如果 websocket 无效/报错,尝试重新连接? -
使用时间戳而不是标志
-
为什么不能定期从其他选项卡请求新的 websocket 连接,如果用户已经有另一个连接,则返回带有重试时间戳的错误?
标签: javascript html reactjs