我正在开发一个客户必须能够通过WebSockets与服务器通信的项目。由于我们开发的应用程序对用户输入具有高响应性,因此我们决定让WebWorker通过网络进行所有通信,以便慢速连接不会中断GUI。到目前为止工作正常。
现在我们考虑了如果网络很慢并且要发送的消息量很高的必要优化。由于大多数这些消息只是为了同步其他一些客户端用户界面,我们可以在必要时删除其中一些消息。但要做到这一点,我们需要有可能在遇到拥堵时检测情况。
我们提出了一个队列的想法:每个要发送的消息都被推送到一个队列中,而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”类型的消息到达但是工作人员无法处理任何事件时,就会发生这种情况。因此,它可以循环队列或推送消息,而不是两者。
我需要的是以某种方式推送此队列上的数据的方法。如果这不容易实现,我想知道是否有人可以想出另一种方法来找出邮件何时到达更快然后发送。任何提示?
提前致谢!
答案 0 :(得分:2)
你必须给工人时间来处理onmessage事件。执行while(true)
将占用所有处理时间,并且不允许执行任何事件。
您可以将其更改为
function processMessageQueue() {
if(queue.length > 0) ws.send(queue.shift());
setTimeout(processMessageQueue, 50);
}