2015-04-26 16 views
10

Sto cercando di implementare wrapper websocket fail-safe. E il problema che ho riguarda gli errori di timeout. La logica dovrebbe essere: se il socket non viene aperto durante $ timeoutInMiliseconds, deve essere chiuso e riaperto $ N volte.Timeout connessione WebSocket

Sto scrivendo qualcosa del genere.

var maxReconects = 0; 
var ws = new WebSocket(url); 
var onCloseHandler = function() { 
    if (maxReconects < N) { 
     maxReconects++; 
     // construct new Websocket 
     .... 
    } 
}; 
ws.onclose = onCloseHandler; 
var timeout = setTimeout(function() { 
       console.log("Socket connection timeout",ws.readyState); 
       timedOut = true; 
       ws.close(); <--- ws.readyState is 0 here 
       timedOut = false; 
},timeoutInMiliseconds); 

Ma il problema sta gestendo timeout WebSockets modo giusto - se sto cercando di chiudere presa nonconnected Ricevo avvertimento in cromo:

"connessione WebSocket a 'WS: //127.0.0.1: 9010/timeout 'fallito: WebSocket viene chiuso prima che venga stabilita la connessione. "

E non ho idea di come evitarlo - l'interfaccia ws non ha alcuna funzione di interruzione.

L'altro errore che ho provato non è quello di chiudere il socket in timeout se non connesso ma semplicemente contrassegnarlo come non usato di più e chiuderlo se riceve readyState più di uno - ma può produrre possibili perdite e complicato per un compito così semplice

risposta

2

La variabile timeout è assegnata alla funzione setTimeout(..., che viene richiamata in modo lessicale. Nel momento in cui il tuo codice arriva a var onCloseHander = ... la tua funzione timeout è già stata invocata.

Una soluzione a questo è di fare una funzione makeTimeout:

var makeTimeout = function (timeoutInMiliseconds) { 
    return window.setTimeout(function() { 
     // do stuff 
    }, timeoutInMiliseconds) 
}; 

var timeoutId = makeTimeout(100) invocherà la funzione setTimeout e impostare timeoutId come valore dell'ID timeout. Se è necessario cancellare questo timeout, è possibile farlo invocando window.clearTimeout(timeoutId).

Problemi correlati