Tengo una implementación JavaScript Websockets en la que me gustaría usar un modelo singleton que utiliza una conexión Websocket para múltiples llamadas al servidor pero con diferentes manejadores de eventos de devolución de llamada. Tengo la implementación funcionando bien, pero he notado comportamientos extraños con mensajes dirigidos al controlador de devolución de llamadas incorrecto. Aquí hay un código: FICHAObjeto Singleton Websockets con diferentes controladores de devolución de llamada
Connection.js el archivo
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
Signal.jsvar 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);
}
}
}
}();
Terceros presentar
var Signal = function(){
return {
handlerProcess : function(evt){
// Does some third party stuff...
}
}
}();
uso
connection.send("{type:'process'}", Signal.handlerProcess);
connection.send("{type:'cpu'}", App.cpuUtilization);
connection.send("{type:'memory'}", Signal.handlerMemory);
connection.send("{type:'harddrive'}", Signal.handlerHardDrive);
Ahora creo que estoy viendo el problema es cuando se realizan varias solicitudes a través del mismo websocket y el mensaje vuelve. Como esto es asincrónico, no tengo forma de vincular la solicitud a la devolución de llamada del evento. Mi solución usa las opciones en el controlador como referencia, pero dependiendo del tiempo que demore la ejecución de la solicitud de websocket, se llama al manejador de devolución de llamada incorrecto y el proceso falla. Creo que está fallando porque estoy accediendo a propiedades de la instancia de websocket que puede estar cambiando entre llamadas.
¿Hay alguna manera de pasar una referencia o parámetros adicionales junto con el parámetro evt? Tal vez envolviendo esto de alguna manera?
Gracias. Solo estaba asumiendo que este era el caso. Tendré que idear un proceso diferente. Creo que agregar información a la respuesta del servidor puede hacer el trabajo con algunos cambios menores en el código del cliente. Solo desearía que hubiera propiedades adicionales para el evento onmessage que podría usar para almacenar algunos datos temporales. Gracias de nuevo y ten un buen día – WalkSolutions