I'm trying to figure out a way for my SockJS clients to reconnect to the server if it should go down.
I currently have this:
new_conn = function() {
socket = new SockJS(protocol + serverDomain + '/echo', null, {
'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming', 'iframe-eventsource', 'iframe-htmlfile', 'xdr-polling', 'xhr-polling', 'iframe-xhr-polling', 'jsonp-polling']
});
};
socket.onopen = function () {
clearInterval(recInterval);
};
socket.onclose = function () {
recInterval = window.setInterval(function () {
new_conn();
}, 2000);
};
The problem is that the setInterval
keeps firing even after a successful reconnect. It seems that the socket.onopen
never gets executed.
Any ideas what I could be doing wrong?
I'm trying to figure out a way for my SockJS clients to reconnect to the server if it should go down.
I currently have this:
new_conn = function() {
socket = new SockJS(protocol + serverDomain + '/echo', null, {
'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming', 'iframe-eventsource', 'iframe-htmlfile', 'xdr-polling', 'xhr-polling', 'iframe-xhr-polling', 'jsonp-polling']
});
};
socket.onopen = function () {
clearInterval(recInterval);
};
socket.onclose = function () {
recInterval = window.setInterval(function () {
new_conn();
}, 2000);
};
The problem is that the setInterval
keeps firing even after a successful reconnect. It seems that the socket.onopen
never gets executed.
Any ideas what I could be doing wrong?
Share Improve this question edited Jun 18, 2014 at 12:38 franzlorenzon 5,9436 gold badges37 silver badges58 bronze badges asked Sep 21, 2013 at 8:57 AlosyiusAlosyius 9,11126 gold badges78 silver badges121 bronze badges 3 |2 Answers
Reset to default 10I think it could be related to variable scoping. Try this:
var recInterval = null;
new_conn = function() {
socket = new SockJS(protocol + serverDomain + '/echo', null, {
'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming', 'iframe-eventsource', 'iframe-htmlfile', 'xdr-polling', 'xhr-polling', 'iframe-xhr-polling', 'jsonp-polling']
});
};
socket.onopen = function () {
clearInterval(recInterval);
};
socket.onclose = function () {
recInterval = window.setInterval(function () {
new_conn();
}, 2000);
};
Anyway, it's strange, because you were declaring recInterval
on the window
object, and it should have worked. If it doesn't work, you could also debug it with a browser, with debugger;
statements or interactively by setting local breakpoints... (in onopen
, for example).
By the way, I rewrited the whole code like this (I like refactoring:):
var recInterval = null;
var socket = null;
var new_conn = function() {
socket = new SockJS(protocol + serverDomain + '/echo', null, {
'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming',
'iframe-eventsource', 'iframe-htmlfile',
'xdr-polling', 'xhr-polling', 'iframe-xhr-polling',
'jsonp-polling']
});
socket.onopen = function () {
clearInterval(recInterval);
};
socket.onclose = function () {
recInterval = setInterval(function () {
new_conn();
}, 2000);
};
};
In case anyone still interested in this topic: The refactored code snippet from franzlorenzon causes a lot of reconnects since it is kind of recursive reconnecting itself somehow since each two seconds a new onclose event is spawned (regardless of the recInterval).
Moving the clear interval right after the socket creation does the trick. I also added a socket = null in the onclose event.
var recInterval = null;
var socket = null;
var new_conn = function() {
socket = new SockJS(protocol + serverDomain + '/echo', null, {
'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming',
'iframe-eventsource', 'iframe-htmlfile',
'xdr-polling', 'xhr-polling', 'iframe-xhr-polling',
'jsonp-polling'
]
});
clearInterval(recInterval);
socket.onopen = function() {
};
socket.onclose = function() {
socket = null;
recInterval = setInterval(function() {
new_conn();
}, 2000);
};
};
setInterval()
is better because OP wants to keep trying (while server is down) until it connects – TMG Commented Jan 2, 2016 at 2:23close
event will actually be fired if a connection is attempted when the server is down, so a singlesetTimeout()
is all that is necessary. – Herohtar Commented Apr 6, 2021 at 21:14