我工作在一個客戶端必須能夠通過的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'類型的消息時,應該會發生這種情況,但工作人員無法忙於處理任何事件。所以它可以循環播放隊列或推送消息,而不是兩者。
我需要的是一個辦法以某種方式推動這個隊列中的數據。如果這不容易,我想知道是否有人可以想出另一種方式來查明消息何時到達,然後發送。任何提示?
在此先感謝!
噢,那是太容易了。像魅力一樣工作,謝謝! – j0ker 2012-01-08 04:26:02