1

我想在 2 小时不活动后断开用户与 socket.io 的连接,并给他们一个提示/重新连接按钮。

首先,我将自动重新连接设置为 false 和一个变量 forcec:

var socket = io.connect('https://coinchat.org:443',{secure: true, reconnect: false});
var forcedc = false;

接下来,当有人移动鼠标时,我有一个不活动的超时时间:

$("body").mousemove(function(e){
    clearTimeout(dcTimeout);
    dcTimeout = setTimeout(function(){
        if(!forcedc){
            forcedc = true;
            socket.disconnect();
            $("#dcmodal").modal('show');
        }
    }, 1000 * 60 * 60 * 2);
});

基本上,forcedc 意味着用户由于不活动而断开连接,浏览器不应刷新页面以尝试重新连接。如果forcedc为false,表示用户因网络问题断开/服务器重启,浏览器需要刷新页面重新连接。

现在,当套接字断开连接时:

socket.on("disconnect", function(data){
    if(!forcedc){
        setTimeout(function(){document.location.reload(true)}, 1000 + Math.random()*12750);
    }
});

如果forcedc 为false,页面应该刷新。但是,即使用户由于不活动而已经“断开连接”,页面也会刷新(我知道强制c = true 已经执行,因为我看到了断开连接的模式)。

我究竟做错了什么?

4

3 回答 3

1

我相信 dcTimeout 永远不会通过“clearTimeout(dcTimeout);”被清除。因此,dcTimeout 被执行并且forcedc 变为真。

可能的解决方案:将 dcTimeout 与 forcec 一起声明为全局变量。这是一个带有我的测试代码的jsfiddle 链接供您参考。

function communication() {  

  var socket = io.connect('http://localhost:8080',{reconnect: false});
  socket.on('connect', function () {

      var forcedc = false;
      var dcTimeout = null;

      console.log("connected to the server!");

      socket.on('news', function (data) {

        console.log(data);
      });

      socket.on("disconnect", function(data){

          console.log("disconnected..")
          if(!forcedc){
              console.log("forcedc is false and the socket has been disconnected");
              setTimeout(function(){
                  console.log("Reloading the document in 2 seconds");
                  //document.location.reload(true)
              }, 2000);
          }
      });

      document.onmousemove = function(e){

          console.log("mouse movement detected");
          clearTimeout(dcTimeout);
          dcTimeout = setTimeout(function(){
              if(!forcedc){
                  forcedc = true;
                  console.log("disconnecting...setting to true");
                  socket.disconnect();
                  //$("#dcmodal").modal('show');
                  console.log("Disconnected! Do you want to reconnect?");
              }
          }, 5000 * 1);
      }
  });
}
于 2013-08-25T00:17:16.230 回答
0

我想它必须与闭包有关......你在哪里声明强制c?你的整个代码中的那两段代码在哪里?

显然,forcedc 变量没有按应有的方式更新,这可能意味着其中一个是本地副本

于 2013-08-19T14:20:52.153 回答
0

没有更多细节很难回答。还有其他地方可以在代码上使用forcec吗?您可以尝试的一件事是将其放入对象中:namespace.forcedc = true 以强制闭包继承

于 2013-08-20T10:14:07.607 回答