2012-06-20 16 views
7

Mam implementację JavaScript Websockets, w której chciałbym użyć modelu singleton, który używa jednego połączenia Websocket do wielu wywołań do serwera, ale z różnymi procedurami obsługi wywołań zwrotnych. Mam wdrożenie działa dobrze, ale zauważyłem dziwne zachowania z wiadomościami skierowanymi do niewłaściwej obsługi wywołania zwrotnego. Oto kod:Obiekt Singleton Websockets z różnymi procedurami obsługi wywołań zwrotnych

Connection.js złożyć

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 złożyć

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

Third Party Signal.js złożyć

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

Wykorzystanie

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

Teraz, gdy myślę, że widzę problem, gdy wiele żądań jest dokonywanych za pośrednictwem tego samego websocket, a wiadomość powraca. Ponieważ jest to asynchroniczne, nie mam możliwości powiązania żądania z wywołaniem zwrotnym zdarzenia. Moje rozwiązanie wykorzystuje opcje w module obsługi do odniesienia, ale w zależności od czasu potrzebnego na uruchomienie żądania websocket, wywoływana jest niewłaściwa procedura obsługi wywołania zwrotnego i proces kończy się niepowodzeniem. Myślę, że to się nie udaje, ponieważ uzyskuję dostęp do właściwości z instancji websocket, która może zmieniać się między wywołaniami.

Czy istnieje sposób przekazania referencji lub dodatkowych parametrów wraz z parametrem evt? Może jakoś to owinąć?

Odpowiedz

7

myślę, że to nie udaje, bo jestem właściwości z instancji websocket które mogą się zmieniać między połączeniami dostępu.

Tak.

Ponieważ jest to asynchroniczne, nie mam możliwości powiązania żądania z wywołaniem zwrotnym zdarzenia.

Nie można utworzyć zamknięcie dla funkcji zwrotnej zamiast dzwonić używając callback bezpośrednio:

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

Ale wciąż masz zmieniający się obsługi onmessage oddzwonienia. Oznacza to, że zdarzenie może zostać wysłane do programu obsługi, który na to nie zasługuje. Posiadając system asynchroniczny, będziesz musiał dodać fragment informacji do odpowiedzi serwera, która wskazuje do którego procesu dane należą. Jeden uniwersalny moduł obsługi komunikatów mógłby rozwiązać ten problem i wywołać odpowiednie wywołanie zwrotne.

+0

Dziękuję. Zakładałem, że tak właśnie jest. Będę musiał wymyślić inny proces. Myślę, że dodanie niektórych informacji do odpowiedzi serwera może wykonać zadanie z niewielkimi zmianami w kodzie klienta. Chciałbym tylko, aby były dodatkowe właściwości zdarzenia zdarzenia, które mógłbym wykorzystać do przechowywania tymczasowych danych. Jeszcze raz dziękuję i życzę miłego dnia – WalkSolutions

Powiązane problemy