2012-03-29 19 views
9

Sto utilizzando Nodejs e Socket.io. Quando il client si connette, vengono creati nuovi oggetti JavaScript.Rimuovi oggetti su disconnect socket.io

Questi oggetti si attardano per sempre? Dovrebbero essere cancellati o rimossi quando il client si disconnette? È anche possibile rimuovere un oggetto? So che la cancellazione non funzionerà ...

Grazie - Immagino che questa sia più di una domanda generale e qualsiasi suggerimento sarebbe davvero utile.

Grazie!

risposta

17

Se non si pulisce, allora sì, resteranno lì per sempre poiché presumo che li stiate facendo globali.

Si dovrebbe pulizia una volta un utente si disconnette dal legame con l'ascoltatore disconnect evento:

var clients = {} 
sockets.on('connection', function(socket) { 
    clients[socket.id] = socket; 

    socket.on('disconnect', function() { 
    delete clients[socket.id]; 
    }); 
}); 
+1

Grande, grazie! Suppongo di poter utilizzare lo stesso metodo per i "client" per tenere traccia anche di altri oggetti? Ci sono molti altri oggetti al di fuori della funzionalità 'socket' che sono stati creati. – dzm

+0

jup! Ciò che alcune persone fanno, aggiungono gli oggetti all'interno della variabile "socket" e viene distrutto automaticamente. 'socket.data =" foo "' e quindi i client hanno solo un id per quel socket. –

+0

Perfetto, è una buona idea. Grazie ancora! – dzm

0

Penso che la risposta accettata non è realmente risolvere il problema. Quando si esegue: eventi

io.on('connection', function(socket){ 
    socket.on('event', function(){ 
     console.log('event fired'); 
    }); 
    socket.on('disconnect', function(){ 
     console.log('user disconnected'); 
    }); 
}); 

presa ascoltatori vengono creati all'interno io.on richiamata (s '). Dopo la disconnessione, questi eventi ascoltatori in realtà non vengono rimossi .. dovrei fare qualcosa di simile:

socket.on('disconnect', function(){ 
    delete socket.namespace.sockets[this.id]; 
    console.log('user disconnected'); 
}); 

A meno socket.io rimuovere internamente tutte le eventlisenters all'interno del io.on) callback (. Eventlisteners persist

+0

eliminazione non consentita in modalità rigorosa esiste un altro modo per ottenere ciò? –