2013-09-21 13 views
9

Próbuję znaleźć sposób dla moich klientów SockJS, aby ponownie połączyć się z serwerem, jeśli powinien on ulec awarii.Klient SockJS automatycznie łączy się ponownie?

Obecnie mam to:

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

Problemem jest to, że setInterval utrzymuje wypalanie nawet po udanym ponownym połączeniu. Wygląda na to, że socket.onopen nigdy nie zostanie wykonany.

Jakieś pomysły, co mógłbym zrobić źle?

+2

w przypadku korzystania setTimeout() powinna być lepsza niż setInterval() – Fielding34

+0

@ Fielding34 Właściwie myślę, że wręcz przeciwnie - 'setInterval()' jest lepiej, bo PO chce zachować próbuje (gdy serwer jest wyłączony), dopóki nie połączy się – TMG

Odpowiedz

10

Myślę, że może to być związane ze zmiennym scopingiem. Spróbuj tego:

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

W każdym razie, jest to dziwne, ponieważ zostałeś deklarując recInterval na obiekcie window i powinien on pracował. Jeśli to nie zadziała, możesz również debugować go za pomocą przeglądarki, z instrukcjami debugger; lub interaktywnie, ustawiając lokalne punkty przerwania ... (na przykład: onopen).

Nawiasem mówiąc, ja rewrited cały kod jak to (lubię refaktoryzacji :):

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

na wypadek gdyby ktoś jeszcze interesuje się tym temacie: Kod refactored urywek z franzlorenzon powoduje wiele wznawia od jest to rodzaj rekursywnego ponownego łączenia się w jakiś sposób, ponieważ co dwie sekundy pojawia się nowe zdarzenie onclose (bez względu na recInterval).

Przeniesienie klarownego odstępu zaraz po utworzeniu gniazda wykonuje lewę. Dodałem również socket = null w zdarzeniu onclose.

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

+1

Dzięki za udostępnienie tego. Przydałby się również protokół back-off, w którym wzrasta czas między kolejnymi próbami ponownego połączenia. Następnie zrezygnuj z czasu ponownego połączenia, jeśli użytkownik jest "sfrustrowany" monitorując przewijanie w aplikacji. Najwyraźniej będą one powodować ponowną próbę ponownego połączenia przez ponowne załadowanie strony. – coding

+0

@ kodowanie Tak, masz rację. Powyższy kod jest tylko przykładem, który naprawia błędy z poprzedniego przykładu. Używamy rozwiązania takiego, jak sugerujesz w naszych systemach produkcyjnych i działa dobrze. Również używam podobnego rozwiązania dla prywatnych projektów. Bez żadnych komplikacji. :) – daPhantom

Powiązane problemy