2013-09-21 14 views
9

Sto cercando di trovare un modo per i miei client SockJS di riconnettersi al server se dovesse andare giù.Riconnessione automatica client SockJS?

Al momento ho questo:

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

Il problema è che il setInterval mantiene sparare anche dopo una riconnessione con successo. Sembra che il socket.onopen non venga mai eseguito.

Qualche idea su cosa potrei fare male?

+2

nel tuo caso, usando setTimeout() dovrebbe essere migliore di setInterval() – Fielding34

+0

@ Fielding34 In realtà penso che sia proprio il contrario - 'setInterval()' è meglio perché OP vuole mantenere provando (mentre il server è giù) fino a quando non si connette – TMG

risposta

10

Penso che potrebbe essere correlato all'ambito della variabile. Prova questo:

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

In ogni caso, è strano, perché si erano dichiarando recInterval sull'oggetto window, e dovrebbe aver funzionato. Se non funziona, puoi anche eseguirne il debug con un browser, con le istruzioni debugger; o in modo interattivo impostando i punti di interruzione locali ... (ad esempio in onopen).

A proposito, ho riscritto l'intero codice come questo (mi piace refactoring :):

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

Nel caso qualcuno ancora interessato a questo argomento: Il frammento di codice refactoring da franzlorenzon provoca un sacco di riconnette dal è in qualche modo ricorsivo ricollegarsi in qualche modo poiché ogni due secondi viene generato un nuovo evento onclose (indipendentemente dal recInterval).

Spostare l'intervallo di visualizzazione immediatamente dopo la creazione del socket. Ho anche aggiunto un socket = null nell'evento 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

Grazie per aver condiviso questo. Potrebbe anche essere bello avere un protocollo di back-off in cui il tempo tra i tentativi di riconnessione aumenta. Quindi, elimina il tempo di riconnessione se l'utente è "frustrato" monitorando lo scorrimento nell'app. Chiaramente attiveranno un tentativo di riconnessione semplicemente ricaricando la pagina. – coding

+0

@coding Sì, hai ragione. Il codice sopra riportato è solo un esempio che corregge gli errori dell'esempio precedente. Stiamo utilizzando una soluzione come suggerita dai nostri sistemi di produzione e funziona perfettamente. Inoltre sto usando una soluzione simile per i progetti privati. Nessuna complicazione pure. :) – daPhantom

Problemi correlati