是否有可能取消WebSocket连接,而试图建立连接到服务器?
假设用户通知它是一个拼写错误的主机,并希望在onerror引发(如
)之前取消建立连接的请求failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED
我尝试调用close,但这并没有取消请求。我甚至在控制台得到警告:
failed: WebSocket在连接建立之前被关闭。
不幸的是,使用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
自从这个问题的前两个答案被发布以来,close()
的行为似乎已经改变了。
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上测试)。
close()方法只终止已建立的连接。对于你的情况,你可以将你的websocket句柄赋值为null,在你想停止它的地方。
webSocketHanle = null;
通过此分配,您的回调将不会被激活。
但是请注意,从服务器获得响应的过程非常快。