节点:使用套接字事件区分重新加载事件和浏览器出口

时间:2013-07-13 06:16:42

标签: node.js sockets websocket socket.io

我希望在套接字关闭时运行一些代码,但仅当用户没有重新加载页面时...

我有类似

的东西
socket.on("close", function() {
//do something here
});

问题是此函数在重新加载事件期间也会运行...我可以以某种方式暂停它以便稍后运行时使用该值。我尝试在回调中使用set timeout但无法再从回调中访问套接字对象。

如果在不久之后重新获得套接字连接,阻止函数运行的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

我的想法的主要概念是,你永远不会知道用户正在重新加载或断开连接并且永远不会回来1天左右,有办法检测到浏览器正在离开网站,但是无法知道(在服务器端),它将转到相同的地址,或不同的..

相反,如果任何客户端断开连接,当然断开事件将被触发到该套接字的socket.io服务器,因此考虑到这一点你可以将会话变量设置为false,你可以说播放器是“断开连接”所以当该会话的客户端“重新连接”又称重新加载时,socket.io将触发“连接”事件,但是读取会话变量,您可以说客户端先前已断开连接,然后再次连接。时间戳可能适用于此,因此15分钟后重新连接将需要加载一些额外的数据等。

所以你可以尝试使用session(假设你使用express或者其他东西)

sockets.on("connection",function(socket){
 if(session.isAReload){
  // this is a reconnection
 }
 socket.set("isAReload",session.isAReload /*defaults to false*/);
});

sockets.on('close',function(){
 socket.get('isAReload',function(err,isAReload){
  if(isAReload){
   // closed after reconnecting
  }else{
   /*
    just closed connection, so next time it will be a "reload" or reconnection
    a timer of lets say 30s could run to ensure that the client is reloading
    */
   session.isAReload=true; 
  }
 });
})