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ąć?
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