我正试图找出一种方法让我的SockJS客户端重新连接到服务器,如果它应该关闭。
我目前有这个:
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);
};
问题是setInterval
即使在成功重新连接后也会继续发射。似乎socket.onopen
永远不会被执行。
任何想法我可能做错了什么?
答案 0 :(得分:10)
我认为这可能与变量范围有关。试试这个:
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);
};
无论如何,这很奇怪,因为你在recInterval
对象上声明window
,它应该有效。如果它不起作用,您也可以使用浏览器调试它,使用debugger;
语句或通过设置本地断点进行交互...(例如,在onopen
中)。
顺便说一句,我重写了这样的整个代码(我喜欢重构:):
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);
};
};
答案 1 :(得分:8)
如果有人仍然对这个主题感兴趣:来自franzlorenzon的重构代码片段会导致大量的重新连接,因为它会以某种方式递归重新连接,因为每两秒钟会产生一个新的onclose事件(无论recInterval如何)。 / p>
在套接字创建后立即移动清除间隔。我还在onclose事件中添加了一个socket = null。
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);
};
};