Wal*_*ons 8 javascript websocket
我有一个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);
}
}
}();
Run Code Online (Sandbox Code Playgroud)
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);
}
}
}
}();
Run Code Online (Sandbox Code Playgroud)
第三方Signal.js文件
var Signal = function(){
return {
handlerProcess : function(evt){
// Does some third party stuff...
}
}
}();
Run Code Online (Sandbox Code Playgroud)
用法
connection.send("{type:'process'}", Signal.handlerProcess);
connection.send("{type:'cpu'}", App.cpuUtilization);
connection.send("{type:'memory'}", Signal.handlerMemory);
connection.send("{type:'harddrive'}", Signal.handlerHardDrive);
Run Code Online (Sandbox Code Playgroud)
现在我认为我发现问题是当通过相同的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);
}
Run Code Online (Sandbox Code Playgroud)
但是,你仍然有一个不断变化的onmessage回调处理程序.这意味着,可以将事件发送给不值得的事件处理程序.拥有一个异步系统,您需要向服务器响应添加一条信息,指示数据属于哪个进程.然后,一个通用消息处理程序可以解决该问题并调用正确的回调.
| 归档时间: |
|
| 查看次数: |
5371 次 |
| 最近记录: |