5

我正在开发一个客户端必须能够通过 WebSockets 与服务器通信的项目。由于我们开发的应用程序对用户输入具有高度响应性,因此我们决定让 WebWorker 通过网络进行所有通信,这样慢速连接就不会中断 GUI。到目前为止效果很好。

现在我们考虑在网络速度慢且要发送的消息量很大的情况下进行必要的优化。由于这些消息中的大多数仅用于同步其他一些客户端用户界面,因此我们可以在必要时删除其中的一些。但要做到这一点,我们需要能够检测拥塞时的情况。

我们提出了队列的想法:每条要发送的消息都被推送到一个队列中,WebWorker 除了永久地遍历队列并发送它在那里找到的所有消息之外什么都不做。这样,如果队列中有一定数量的元素(即消息发送太慢),我们稍后可以让 Worker 采取不同的行动。这个想法简单明了,但实现起来似乎并非如此。

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);

如您所见,worker 在收到消息后立即创建 WebSocket。然后它执行函数 processMessageQueue(),这是一个循环,通过 WebSocket 发送数据来永久清空队列。现在,我的问题是似乎不可能将消息推送到队列中。当“SEND”类型的消息到达但它不能因为 Worker 太忙而无法处理任何事件时,应该会发生这种情况。所以它可以循环队列或推送消息,而不是两者兼而有之。

我需要的是一种以某种方式将数据推送到此队列的方法。如果这不容易实现,我想知道是否有人可以想出另一种方法来找出消息何时到达更快然后发送。有什么提示吗?

提前致谢!

4

1 回答 1

2

您必须给工作人员时间来处理 onmessage 事件。执行while(true)将占用所有处理时间,并且不允许执行任何事件。

例如,您可以将其更改为

function processMessageQueue() {
    if(queue.length > 0) ws.send(queue.shift());
    setTimeout(processMessageQueue, 50);
}
于 2012-01-08T04:08:12.903 回答