2012-01-08 72 views
5

我工作在一個客戶端必須能夠通過的WebSockets與服務器進行通信的項目。由於我們開發的應用程序對用戶輸入高度敏感,因此我們決定讓WebWorker通過網絡進行所有通信,以便慢速連接不會中斷GUI。迄今爲止工作正常。的JavaScript:使用隊列網絡通信

現在,我們想到了優化,如果網絡速度緩慢並且郵件的發送量高,這將是必要的。由於大多數這些消息將僅用於同步其他一些客戶端用戶界面,因此如有必要,我們可以放棄其中一些用戶界面。但是爲了做到這一點,我們需要有可能在堵塞時檢測情況。

我們想出了一個隊列的想法:每個消息被髮送到隊列推和WebWorker確實沒有什麼比在隊列永久迭代和發送所有找到有消息人。這樣,如果隊列中有一定數量的元素(即消息發送速度太慢),我們可以稍後讓工作人員採取不同的行爲。這個想法很簡單直接,但是,實現似乎不是。

var ws; 
var queue = new Array(); 

function processMessageQueue() { 
    while(true) 
     if(queue.length > 0) ws.send(queue.shift()); 
} 

self.addEventListener('message', function(e) { 
    var msg = e.data; 
    switch(msg.type) { 
     case 'SEND': 
      queue.push(JSON.stringify(msg)); 
      break; 
     case 'CREATE_WS': 
      ws = new WebSocket(msg.wsurl); 
      ws.onmessage = function(e) { 
       self.postMessage(JSON.parse(e.data)); 
      } 
      processMessageQueue(); 
    } 
}, false); 

正如您所看到的,工作人員在收到消息後立即創建WebSocket。然後它執行函數processMessageQueue(),它是通過WebSocket發送它們的數據永久清空隊列的循環。現在,我的問題是似乎沒有可能將消息推入隊列。當發送'SEND'類型的消息時,應該會發生這種情況,但工作人員無法忙於處理任何事件。所以它可以循環播放隊列或推送消息,而不是兩者。

我需要的是一個辦法以某種方式推動這個隊列中的數據。如果這不容易,我想知道是否有人可以想出另一種方式來查明消息何時到達,然後發送。任何提示?

在此先感謝!

回答

2

你必須給工人的時間來處理的onMessage事件。做while(true)將花費所有的處理時間,不允許執行任何事件。

你可以例如將其更改爲

function processMessageQueue() { 
    if(queue.length > 0) ws.send(queue.shift()); 
    setTimeout(processMessageQueue, 50); 
} 
+0

噢,那是太容易了。像魅力一樣工作,謝謝! – j0ker 2012-01-08 04:26:02