У меня есть реализация веб-сокетов JavaScript, в которой я хотел бы использовать одноэлементную модель, которая использует одно соединение веб-сокета для нескольких вызовов на сервер, но с разными обработчиками событий обратного вызова. У меня реализация работает нормально, но я заметил странное поведение с сообщениями, направляемыми не тому обработчику обратного вызова. Вот некоторый код:
Файл 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 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 третьей стороны
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);
Теперь, когда я думаю, что вижу проблему, когда делается несколько запросов через тот же веб-сокет, и сообщение возвращается. Поскольку это асинхронно, у меня нет возможности связать запрос с обратным вызовом события. В моем решении для справки используются параметры обработчика, но в зависимости от времени, которое требуется для запуска запроса веб-сокета, вызывается неправильный обработчик обратного вызова, и процесс завершается сбоем. Я думаю, что это не удается, потому что я обращаюсь к свойствам экземпляра веб-сокета, которые могут меняться между вызовами.
Есть ли способ передать ссылку или дополнительные параметры вместе с параметром evt? Может быть, это как-то обернуть?