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