2012-06-20 27 views
7

私は、WebSocket接続を使用して、サーバーへの複数のコールに異なるコールバックイベントハンドラを使用するシングルトンモデルを使用するJavaScript Websocket実装を使用しています。私は実装がうまく動作しているが、メッセージが間違ったコールバックハンドラに送られるという奇妙な振る舞いに気付いた。ここではいくつかのコードは次のとおりです。異なるコールバックハンドラを持つシングルトンWebSocketオブジェクト

Connection.jsは

var connection = function(){ 
    var _socket = null; 
    return { 
     socket : function(){ 
      if (_socket == null){ 
       _socket = new WebSocket("ws://localhost:8081/index.ashx"); 
       _socket.onclose = function(evt){alert('Closed');} 
       _socket.extraParameter = null; 
      } 
      return _socket; 
     }, 
     send : function(data, callback){ 
      var localSocket = connection.socket(); 
      localSocket.extraParameter = new Date().toString(); 
      localSocket.onmessage = callback; 
      localSocket.originalDataSent = data; 
      localSocket.send(data); 
     } 
    } 
}(); 

App.jsが

var Signal = function(){ 
    return { 
     handlerProcess : function(evt){ 
      // Does some third party stuff... 
     } 
    } 
}(); 

使い方

connection.send("{type:'process'}", Signal.handlerProcess); 
connection.send("{type:'cpu'}", App.cpuUtilization); 
connection.send("{type:'memory'}", Signal.handlerMemory); 
connection.send("{type:'harddrive'}", Signal.handlerHardDrive); 
ファイル

var App = function(){ 
    return { 
     cpuUtilization : function(evt){ 
      var localSocket = this; 
      var dateTimeOfRequest = localSocket.extraParameter; 
      var originalDataSent = localSocket.originalDataSent 
      var jsonData = $.parseJSON(evt.data); 
      if ($.parseJSON(originalDataSent).type == "cpu"){ 
       $("#dateTimeContainer").html(); 
       $("#cpuContainer").html(jsonData.value); 
      } 
     } 
    } 
}(); 

第三者Signal.jsをファイルファイル

ここで、私は、同じwebsocketを通じて複数のリクエストが行われ、メッセージが返ってくることがわかります。これは非同期なので、私はイベントコールバックに要求を結びつける方法がありません。私の解決策は、参照のためにハンドラのオプションを使用しますが、WebSocketリクエストの実行にかかる時間に応じて、間違ったコールバックハンドラが呼び出され、処理が失敗します。私は呼び出し間で変更されるwebsocketインスタンスからプロパティにアクセスしているので、失敗していると思います。

evtパラメータとともに参照パラメータまたは追加パラメータを渡す方法はありますか?何とかこれを包み込んでいるのでしょうか?

答えて

7

私は呼び出し間で変更されるwebsocketインスタンスからプロパティにアクセスしているため、失敗していると思います。

はい。

これは非同期なので、イベントコールバックにリクエストを結びつける方法がありません。

あなたが代わりに直接callbackを使用して呼び出すコールバック関数のためのクロージャを作成することができます品番:

... send: function(data, callback){ 
    var localSocket = connection.socket(); 
    var extraParameter = new Date().toString(); 
    localSocket.onmessage = function(evt) { 
     callback(evt.data, /* original- */ data, extraParameter); 
    }; 
    localSocket.send(data); 
} 

しかし、それでもまだ、あなたは変更onmessageコールバックハンドラを持っています。つまり、イベントに値するハンドラにイベントが送信される可能性があります。非同期システムを持つ場合、データがどのプロセスに属しているかを示す情報をサーバーの共振に追加する必要があります。 1つのユニバーサルメッセージハンドラがそれを解決し、正しいコールバックを呼び出すことができます。

+0

ありがとうございます。私はこれが当てはまると仮定していました。私は別のプロセスを考えなければならないでしょう。私はいくつかの情報をサーバレスポンスに追加することは、クライアントコード上のマイナーな変更を加えて作業を行うかもしれないと思う。私は、一時的なデータを保存するために使用できるonmessageイベントの追加のプロパティがあることを望みます。おかげさまでありがとうございました。 – WalkSolutions

関連する問題