1

ソケットが閉じられているときにコードを実行したいのですが、ユーザーがページをリロードしなかった場合にのみ...

私は次のようなものを持っています

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

問題は、この関数がリロード イベント中にも実行されることです...どうにか一時停止して、後でその時点の値で実行できますか。コールバック内で設定されたタイムアウトを使用しようとしましたが、コールバック内からソケット オブジェクトにアクセスできなくなりました。

ソケット接続がすぐに回復した場合に関数が実行されないようにする最善の方法は何ですか?

4

1 に答える 1

1

私の考えの主な概念は、ユーザーがリロードまたは切断していることを知ることはできず、1 日ほど戻ってこないということです。ブラウザが Web サイトから離れていることを検出する方法はありますが、知ることはできません (サーバーで側) 同じアドレスに送信されるか、異なるアドレスに送信されるか..

代わりに、クライアントが切断された場合、もちろん切断イベントがそのソケットの socket.io サーバーに対して発生するため、セッション変数を false に設定できることを考慮して、プレーヤーが「切断された」と言うことができるので、クライアントがそのセッションの「再接続」別名リロードの場合、socket.io は「接続」イベントを発生させますが、セッション変数を読み取ると、クライアントが以前に切断されてから再度接続されたと言えます。タイムスタンプがこれに適用される可能性があるため、15 分後の再接続では追加のデータなどをロードする必要があります。

したがって、セッションでこれを試すことができます(エクスプレスなどを使用すると仮定します)

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; 
  }
 });
})
于 2013-07-13T07:25:59.320 に答える