具有不同回调处理程序的单一实例 Websockets 对象
Singleton Websockets object with different callback handlers
我有一个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
回调处理程序。这意味着,事件可能会发送到不值得的处理程序。对于异步系统,您需要向服务器共振添加一条信息,以指示数据属于哪个进程。然后,一个通用消息处理程序可以解决这个问题并调用正确的回调。
相关文章:
- ES6构造函数返回基类的实例
- KnockoutJS-组件-多个实例
- 为什么无法在TypeScript中导出类实例
- 如何在GoogleWeb工具包(GWT)中从JSNI调用接口(实例化)
- fluxxor向一个flux实例添加一组以上的操作
- 使用jQuery获取Dropzone实例/对象
- "实例范围”;TypeScript类的getter/setter
- 如何在速度模板中获取LiferayPortlet实例id
- 同一项怎么可能在一个实例中未定义,却在另一个实例上定义
- 实例创建(JS)
- 显示模块模式在Knockout中设置模型的新实例
- 如何获取单选按钮的多个实例的选定单选按钮值
- 逃脱了单一角色的介绍人,而不是实际角色
- 当同一浏览器的两个实例浏览时,Javascript页面如何具有唯一的ID
- 在哪里可以找到RXUI Javascript'时间飞逝'实例
- spine.js在启动时填充模型实例
- 不再需要时使用jQuery/kill实例
- 如何在用户输入时实例化数组
- 具有不同回调处理程序的单一实例 Websockets 对象
- 如何在使用 {{render}} 时访问非单一实例的父控制器