我有一個JavaScript Websockets實現,我想使用一個單例模型,它使用一個Websocket連接對服務器進行多個調用,但使用不同的回調事件處理程序。我的實現工作正常,但已經注意到一些奇怪的行爲,消息被指向錯誤的回調處理程序。下面是一些代碼:具有不同回調處理程序的單例Websockets對象
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參數一起傳遞?也許包裝這個莫名其妙?
謝謝。我只是假設情況是這樣。我將不得不提出一個不同的流程。我認爲向服務器響應添加一些信息可能會對客戶端代碼進行一些小的更改。我只希望onmessage事件有其他屬性,我可以用它來存儲一些臨時數據。再次感謝,祝你有美好的一天 – WalkSolutions