1

非アクティブ状態が 2 時間続いた後、ユーザーを socket.io から切断し、プロンプト/再接続ボタンを表示したいと思います。

まず、自動再接続をfalseに設定し、変数forcedcを設定しました:

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 の場合、ページは更新されます。ただし、非アクティブのためにユーザーがすでに「切断」されている場合でも、ページは更新されます (切断されたモーダルが表示されるため、forcedc = true が実行されたことがわかります)。

私は何を間違っていますか?

4

3 に答える 3

1

「clearTimeout(dcTimeout);」によって dcTimeout がクリアされることはないと思います。したがって、dcTimeout が実行され、forcedc が true になります。

考えられる解決策: dcTimeout を、forcedc とともにグローバル変数として宣言します。参照用に、私のテスト コードを含む 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

これ以上の詳細がないと、答えるのは難しいです。コードでforcedcを使用する別の場所はありますか? あなたが試すことができる1つのことは、それをオブジェクトに入れることです: namespace.forcedc = true クロージャの継承を強制する

于 2013-08-20T10:14:07.607 に答える
0

私はそれがクロージャーにあるに違いないと思います...あなたはforcedcをどこで宣言していますか? そして、コード全体でこれらの 2 つのコードはどこにありますか?

forcedc 変数が正常に更新されていないようです。これは、そのうちの 1 つがローカル コピーであることを意味している可能性があります。

于 2013-08-19T14:20:52.153 に答える