我想实现以下行为。假设客户端有一个按钮,它触发了一个通过 websocket 发送消息的函数。第一次调用此函数时,会创建一个 WebSocket 实例,然后在以后的调用中使用。
创建 WebSocket 实例是非阻塞的。构造函数立即返回一个 WebSocket 对象,在后台开始握手。成功的连接会触发 onopen 回调。
当第二个呼叫进来并且 websocket 仍在执行握手(例如,用户双击按钮)时,就会出现问题。当 websocket 完成握手时,所有的消息都需要排队发送。
以下代码使用 jQuery 和自定义事件来收集握手期间收到的所有消息。
var ws = null;
function sendMessage(message) {
if (!ws) {
ws = new WebSocket("ws://example.com");
ws.onopen = function() {
$(document).trigger('handshakeComplete');
}
}
if (ws.readyState == WebSocket.CONNECTING) { // *
$(document).bind('handshakeComplete', message, function(event) {
ws.send(event.data);
});
} else if (ws.readyState == WebSocket.OPEN) {
// use the persistent connection
ws.send(message);
}
}
星号行的条件可能被评估为真,并且在那一刻 websocket 进入 OPEN 状态,执行 onopen 回调,并且只有在此之后,当前消息才被添加到等待握手完成事件的队列中。这将导致消息丢失。
我想避免这种情况,如果有任何想法、意见或建议,我将不胜感激。