Я бы хотел добиться следующего поведения.Предположим, что на стороне клиента есть кнопка, которая запускает функцию, которая отправляет сообщение через веб-сокет.При первом вызове этой функции создается экземпляр WebSocket, который затем используется в будущих вызовах.
Создание экземпляра WebSocket не является блокирующим.Конструктор немедленно возвращает объект WebSocket, начиная рукопожатие в фоновом режиме.Успешное соединение запускает обратный вызов onopen.
Проблема появляется, когда поступает второй вызов, и веб-сокет все еще выполняет рукопожатие (например, пользователь делает двойной щелчок по кнопке).Все сообщения должны быть поставлены в очередь и отправлены после завершения рукопожатия.
В следующем фрагменте кода используется 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);
}
}
Возможно, что условие в звездной строке будет оценено как истинное, и в этот момент веб-сокет перейдет в состояние ОТКРЫТО, обратный вызов onopen будет выполнен, и только после этого текущее сообщение будет добавлено в очередь в ожидании события handshakeComplete.Это может привести к потере сообщений.
Я бы хотел этого избежать, и я был бы признателен за любые идеи, комментарии или предложения.