Объект Singleton Websockets с разными обработчиками обратного вызова

У меня есть реализация веб-сокетов 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? Может быть, это как-то обернуть?

8
задан WalkSolutions 20 June 2012 в 20:03
поделиться