gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 04:12:59 26 4
gpt4 key购买 nike

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

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

现在我认为我看到的问题是当通过同一个 websocket 发出多个请求并且消息返回时。由于这是异步的,我无法将请求与事件回调联系起来。我的解决方案使用了处理程序中的选项作为引用,但是根据 websocket 请求运行所花费的时间,调用了错误的回调处理程序并且处理失败。我认为它失败了,因为我正在访问可能在调用之间发生变化的 websocket 实例的属性。

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

最佳答案

I think it is failing because I am accessing properties from the websocket instance that may be changing between calls.

是的。

Since this is asynchronous, I have no way of tieing the request to the event callback.

没有。您可以为回调函数创建一个闭包,而不是直接使用 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 回调处理程序。这意味着,一个事件可能会被发送到一个不值得的处理程序。拥有一个异步系统,您将需要向服务器响应添加一条信息,指示数据属于哪个进程。然后,一个通用消息处理程序可以解决该问题并调用正确的回调。

关于javascript - 具有不同回调处理程序的单例 Websockets 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11127297/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com