2012-01-08 61 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