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
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. –
Grazie, usiamo riconnessione forzata e manualmente chiamato anche disconnect(). Spero che i SocketIO faranno una macchina di stato affidabile o qualcosa del genere ... –