我正在尝试实现一个WebSocket连接,当我的网站关闭时,每隔X秒重新连接一次,直到它重新上线。到目前为止,我得到了这个:
var onCloseHandler = function() {
reconnect();
}
function reconnect() {
try {
console.log('Connection lost, trying to reconnect...');
socket = new WebSocket(myUrl);
socket.onerror = onErrorHandler;
socket.onmessage = onMessageHandler;
socket.onopen = onOpenHandler;
socket.onclose = onCloseHandler;
} catch (err) {
setTimeout(function() {
reconnect();
}, 1000);
}
}
我的问题是,当onCloseHandler
第一次被调用时(即当我的网站突然离线时),new WebSocket()
调用抛出下一个异常:
WebSocket connection to '<here_goes_my_url>' failed: Error during WebSocket handshake: Unexpected response code: 503
并且没有办法捕获它(在X秒的时间内再次调用相同的函数)或使执行移动到下一行。它只是崩溃,通过浏览器的控制台显示异常,并停止执行。
是否有办法捕获这个异常?
提前感谢。
编辑:只是为了说清楚,onclose
事件不会被第二次调用,我已经检查过了。此外,例外情况(因此,当网站离线时无法连接)是好的;我正在寻找的是一种方法来检测它并驱动setTimeout
在catch
块的执行。
我最终使用了这种方法:
function reconnect() {
console.log('Connection lost, trying to reconnect...');
$.ajax({
url: dummy_http_url_on_the_same_server
success: function() {
//Server is back online
socket = new WebSocket(myUrl);
socket.onerror = onErrorHandler;
socket.onmessage = onMessageHandler;
socket.onopen = onOpenHandler;
socket.onclose = onCloseHandler;
},
error: function() {
//Server is still down
setTimeout(function() {
reconnect();
}, 1000);
}
});
}
由于Ajax调用有一个错误处理程序,我使用它们每X秒检查一次(在本例中,每1秒;在我的应用程序是一个随机数,以避免所有的客户端在同一时间连接,如果我的服务器是在线的。当它是,然后我实例化websocket,知道它肯定不会抛出异常,因为服务器再次启动。
不完全是我希望找到的,但至少它可以工作。