2012-06-20 16 views
7

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.js
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); 
      } 
     } 
    } 
}(); 

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?

Respuesta

7

Creo que está fallando porque estoy accediendo a las propiedades de la instancia de websocket que puede estar cambiando entre las llamadas.

Sí.

Dado que esto es asincrónico, no tengo forma de vincular la solicitud a la devolución de llamada de evento.

No. Puede crear un cierre para la función de devolución de llamada en lugar de llamar directamente utilizando 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); 
} 

Pero aún así, tener un cambio de manejador de devolución de llamada onmessage. Eso significa que un evento puede enviarse a un controlador que no lo merece. Al tener un sistema asíncrono, deberá agregar un fragmento de información a la resonse del servidor que indique a qué proceso pertenecen los datos. El único manejador de mensajes universal podría resolver eso y llamar a la devolución de llamada correcta.

+0

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

Cuestiones relacionadas