#javascript #websocket
#javascript #websocket
Вопрос:
Можно ли отменить подключение к WebSocket при попытке установить соединение с сервером?
Допустим, пользователь уведомлен о том, что это хост с ошибкой, и хочет отменить запрос на установление соединения до того, как возникнет ошибка, например
сбой: ошибка при установлении соединения: net ::ERR_CONNECTION_REFUSED
Я попытался вызвать close, но это не отменяет запрос. Я даже получаю предупреждение в консоли:
сбой: WebSocket закрывается до установления соединения.
Ответ №1:
К сожалению, это невозможно с помощью close()
и, кажется, вообще невозможно.
Кроме того, в отличие от XMLHttpRequest, у WebSocket нет abort
метода для достижения этой цели.
В спецификациях WebSocket не упоминается какой-либо способ сделать это, и установка для объекта значения null
не помогает.
Следующий пример иллюстрирует это, устанавливая для объекта WebSocket null
значение , но все равно получая сообщение об ошибке подключения.
var ws = new WebSocket('ws://unknownhost.local');
ws.onopen = function() {
console.log('ohai');
};
ws = null;
console.log(ws);
// > null
// > VM2346:35 WebSocket connection to 'ws://unknownhost.local/' failed: Error in connection establishment: net::ERR_NAME_NOT_RESOLVED
Комментарии:
1. Спасибо, я прочитал документацию, но был удивлен, что прерывания нет, и я хочу получить подтверждение.
Ответ №2:
Поскольку были опубликованы два предыдущих ответа на этот вопрос, поведение close()
, похоже, изменилось.
Цитирование документов Mozilla API:
Метод WebSocket.close() закрывает подключение к WebSocket или попытку подключения, если таковая имеется. Если соединение уже ЗАКРЫТО, этот метод ничего не делает.
Поэтому вы могли бы сделать это:
var ws = new WebSocket('ws://unknownhost.local');
setTimeout(() => {
if (ws.readyState == WebSocket.CONNECTING) {
ws.close();
console.log("Connection cancelled.");
}
}, 1000);
Что приведет к отмене попытки подключения, если readyState еще не переключился OPEN
.
Я попробовал это, и, похоже, это работает (протестировано в Firefox).
Ответ №3:
метод close() прерывает только установленные соединения. В вашем случае вы можете использовать присвоение вашему дескриптору websocket значения null там, где вы хотите его остановить.
webSocketHanle = null;
При этом назначении ваши обратные вызовы не будут активированы.
Но обратите внимание, что это довольно быстрый процесс получения ответа от сервера.