具有不同回调处理程序的单一实例 Websockets 对象

Singleton Websockets object with different callback handlers

本文关键字:单一 实例 Websockets 对象 程序 处理 回调      更新时间:2023-09-26

我有一个JavaScript Websockets实现,我想使用一个单例模型,该模型使用一个Websocket连接对服务器的多次调用,但具有不同的回调事件处理程序。我的实现工作正常,但注意到一些奇怪的行为,消息被定向到错误的回调处理程序。 下面是一些代码:

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

应用程序.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);
            }
        }
    }
}();

第三方信号.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);

现在我认为我看到的问题在于通过同一个 websocket 发出多个请求并且消息返回。 由于这是异步的,因此我无法将请求绑定到事件回调。 我的解决方案使用处理程序中的选项作为参考,但根据 websocket 请求运行所需的时间,调用了错误的回调处理程序并且进程失败。 我认为它失败了,因为我正在访问可能在调用之间更改的 websocket 实例的属性。

有没有办法将引用或其他参数与 evt 参数一起传递? 也许以某种方式包装这个?

我认为它失败了,因为我正在访问可能在调用之间更改的 websocket 实例的属性。

是的。

由于这是异步的,因此我无法将请求绑定到事件回调。

不。您可以为回调函数创建闭包,而不是直接使用 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);
}

但是,您仍然有一个不断变化的onmessage回调处理程序。这意味着,事件可能会发送到不值得的处理程序。对于异步系统,您需要向服务器共振添加一条信息,以指示数据属于哪个进程。然后,一个通用消息处理程序可以解决这个问题并调用正确的回调。