10

我正在尝试为我的 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永远不会被执行。

有什么想法我可能做错了吗?

4

2 回答 2

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

无论如何,这很奇怪,因为您recIntervalwindow对象上声明,它应该可以工作。如果它不起作用,您还可以使用浏览器、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);
    };
};
于 2013-09-25T09:17:57.777 回答
8

如果有人仍然对这个主题感兴趣:来自 franzlorenzon 的重构代码片段会导致大量重新连接,因为它是一种递归重新连接自身,因为每两秒就会产生一个新的 onclose 事件(无论 recInterval 是多少)。

在创建套接字后立即移动清除间隔就可以了。我还在 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);
  };
};

于 2015-02-13T10:53:17.823 回答