Javascript SockJS客户端自动重新连接?
我正在试图找到一种方法,让我的SockJS客户端在服务器出现故障时重新连接到服务器 我目前有:Javascript SockJS客户端自动重新连接?,javascript,sockjs,Javascript,Sockjs,我正在试图找到一种方法,让我的SockJS客户端在服务器出现故障时重新连接到服务器 我目前有: new_conn = function() { socket = new SockJS(protocol + serverDomain + '/echo', null, { 'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming', 'iframe-eventsou
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
从未执行过
你知道我做错了什么吗?我认为这可能与变量作用域有关。试试这个:
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
,它应该已经工作了。如果它不工作,你也可以用浏览器,用调试器来调试它代码>语句或通过设置本地断点进行交互。。。(例如,在onopen
中)
顺便说一下,我像这样重写了整个代码(我喜欢重构:):
如果还有人对这个主题感兴趣:franzlorenzon的重构代码段会导致大量的重新连接,因为它本身就是一种递归的重新连接,因为每两秒钟就会产生一个新的onclose事件(不管recInterval如何)
在创建套接字之后移动清除间隔就可以做到这一点。我还在onclose事件中添加了一个socket=null
var recInterval=null;
var-socket=null;
var new_conn=函数(){
socket=new SockJS(协议+服务器域+'/echo',空{
“协议\u白名单”:[“websocket”、“xdr流媒体”、“xhr流媒体”,
'iframe eventsource'、'iframe htmlfile',
“xdr轮询”、“xhr轮询”、“iframe xhr轮询”,
“jsonp轮询”
]
});
清除间隔(再间隔);
socket.onopen=函数(){
};
socket.onclose=函数(){
socket=null;
recInterval=setInterval(函数(){
新康涅狄格州;
}, 2000);
};
};
在您的情况下,使用setTimeout()应该比使用setInterval()要好@Fielding34实际上我认为恰恰相反-setInterval()
更好,因为OP希望继续尝试(在服务器关闭时)直到它关闭connects@TMG如果在服务器关闭时尝试连接,close
事件实际上会被触发,因此,只需一个setTimeout()
即可。感谢您的分享。在重新连接尝试之间的时间增加的情况下,有一个退避协议也可能很好。然后,如果用户通过监视应用程序中的滚动而感到“沮丧”,请停止重新连接时间。很明显,只要重新加载页面,它们就会触发重新连接的尝试。@编码“是”,您是对的。上面的代码只是一个示例,它修复了前面示例中的错误。我们正在使用一种解决方案,就像您在我们的生产系统上建议的那样,它工作得很好。此外,我也在为私人项目使用类似的解决方案。也没有并发症。:)
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);
};
};