Отмена подключения к WebSocket при попытке подключения (JavaScript)

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

При этом назначении ваши обратные вызовы не будут активированы.

Но обратите внимание, что это довольно быстрый процесс получения ответа от сервера.