Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript SockJS客户端自动重新连接?_Javascript_Sockjs - Fatal编程技术网

Javascript 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

我正在试图找到一种方法,让我的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
从未执行过


你知道我做错了什么吗?

我认为这可能与变量作用域有关。试试这个:

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);
    };
};