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

とにかく、オブジェクトを宣言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);
    };
};
于 2013-09-25T09:17:57.777 に答える