2012-06-20 69 views
7

我有一個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參數一起傳遞?也許包裝這個莫名其妙?

回答

7

我認爲這是失敗的,因爲我正在訪問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回調處理程序。這意味着,一個事件可能會發送給一個不值得的處理程序。擁有一個異步系統,您需要向服務器添加一條信息,以顯示數據屬於哪個進程。然後一個通用消息處理程序可以解決這個問題並調用正確的回調函數。

+0

謝謝。我只是假設情況是這樣。我將不得不提出一個不同的流程。我認爲向服務器響應添加一些信息可能會對客戶端代碼進行一些小的更改。我只希望onmessage事件有其他屬性,我可以用它來存儲一些臨時數據。再次感謝,祝你有美好的一天 – WalkSolutions

相關問題