2014-09-12 5 views
5

Sto lavorando con un nodo socket.io server e un client socket.io basato angolare (utilizzando angular-socket.io), e funziona bene tranne in 1 condizione specifica: non riesco a capire come totalmente distruggere il socket quando ho finito con esso quando il socket non era in grado di connettersi.AngularJS: socket.io distruggere socket

Il flusso di lavoro è questo: su una determinata pagina è presente un pulsante per aprire un modal, l'apertura del modal inietta la fabbrica presa nel controllore modali e viene effettuata una connessione al server socket.io. Tutto funziona bene quando il socket può connettersi. Quando la modale viene chiusa, viene chiamato $ scope.destroy e il gestore nel controller modale tenta di ripulire il socket.

Questa modale può essere chiusa e riaperta più volte o solo una volta. Il mio processo di creare/distruggere il socket più volte potrebbe essere parte del mio problema, questo potrebbe non essere il paradigma giusto, ma quando la modale è chiusa non ci sarà modo di interagire con esso e dopo che quella pagina è rimasta il socket sicuramente non lo farà Non c'è bisogno di esistere o rimanere connesso.

Socket creazione:

angular.module('app.common.newSocketFactory', ['btford.socket-io']) 
.factory('newSocketFactory', ['socketFactory', function(socketFactory){ 

return function(){ 
    return socketFactory({ioSocket:io.connect('http://localhost:3000', {forceNew: true})}); 
}; 

}]); 

Iniezione:

angular.module('...', [ 
    'app.common.newSocketFactory', 
    .... 
]) 
.controller('Controller', ['$scope', '$modalInstance', 'newSocketFactory', ... 
    function ($scope, $modalInstance, newSocketFactory, ...){ 
    ... 

    $scope.socket = newSocketFactory(); 

Ecco il mio gestore di distruggere:

$scope.$on('$destroy', function(){ 
    $scope.socket.emit('unlisten'); 
    $scope.socket.disconnect(); //have tried passing true too. 
}); 

questo funziona correttamente quando la presa è stato in grado di connettersi prima che il modale era chiuso, l'evento disconnesso nel server osserva che il client è disconnesso. Inoltre, posso chiudere il modal e THEN spegnere il server e non si verifica alcun tentativo di riconnessione.

Quando il server viene arrestato all'apertura del modale, TransportErrors si verifica e vengono effettuati tentativi di riconnessione. Se chiudo il modal a questo punto, gli errori continuano e se riavvio il server il tentativo è riuscito e il client si connetterà al server. La parte peggiore di questo è che utilizzo questo socket per mantenere l'accesso atomico a un componente hardware, che viene bloccato dal primo socket. A meno che non riavvii il server, consenti al socket di connettersi, quindi chiudi il modal (attivando $ destroy sul mio isolare scope e socket.disconnect()), devo aggiornare l'intera pagina per distruggere il socket.

Questa è potenzialmente una domanda angular-socket.io o una normale domanda client socket.io. Ho chiesto su github in angular-socket.io senza alcuna risposta su come smaltire correttamente un socket client angular-socket.io senza risposta.

La mia domanda è questa: A) Se non sto facendo un grave errore con socket.io, come posso disporre in modo sicuro di questo socket client e B) Se sto facendo questo sbagliato, qual è un modo migliore per fare la gestione di un websocket che non dovrebbe persistere da una pagina all'altra.

Nota: il socket angular-socket.io racchiude semplicemente il socket nativo con alcune cose per aiutare a gestire gli ambiti angolari. Quando si chiama disconnect(), il risultato è ciò che appare come il socket sottostante. Ho provato a impostare le impostazioni di riconnessione a false, ecc., Ma nessuna di queste ha funzionato, e non mi piace che il socket sembra ancora esistere anche dopo che l'oscilloscopio è stato completamente distrutto anche se POSSO hackerarlo per smettere di provare a connettermi.

Grazie

risposta

1

Quando ho affrontato problemi simili che ho avuto la conclusione che SocketIO ha una gestione dello stato disordinato a dir poco ... Così mi piacerebbe provare a creare la mia logica di riconnessione, per esempio disabilitare la riconnessione su disconnessione o errore, e riconnettersi solo se lo voglio.

Considererei anche l'utilizzo di SocketIO nativo con gestori di stato come (stuff) => $timeout(() => myHandler(stuff)) e l'utilizzo di un servizio angolare singleton. In questo modo la tua testa non farà male alla chiusura di modali, ambiti persi, ecc.

Inoltre, per favore, invia i tuoi risultati, sono abbastanza interessato a ciò che hai vissuto da allora.

+1

Ehi, grazie per la risposta. Non ho lavorato su questo di recente e non avrò la possibilità di lavorarci di nuovo presto (le funzionalità sono state in produzione per qualche tempo e sembra essere stabile). Il risultato finale che ha funzionato bene per noi è stato impostare la configurazione (inviata a io.connect) per avere forceNew = true. Da lì, creo manualmente il socket con var ioSocket = io.connect (URL + ':' + PORT, opzioni); var socket = socketFactory ({ioSocket: ioSocket}); Da lì, quando si tenta di disconnettere, rimuovere prima tutti i listener sul socket e quindi chiamare socket.disconnect(). Questo ha funzionato per noi finora. –

+0

Grazie, usiamo riconnessione forzata e manualmente chiamato anche disconnect(). Spero che i SocketIO faranno una macchina di stato affidabile o qualcosa del genere ... –