function(foo, cb) {
var bigObject = new BigObject();
doFoo(foo, function(e) {
if (e.type === bigObject.type) {
cb();
// bigObject = null;
}
});
}
L'esempio precedente mostra una chiusura classica, accidentale (o forse) che perde memoria. Il garbage collector V8 non è in grado di determinare se è possibile rimuovere lo bigObject
perché è in uso nella funzione di callback che può essere richiamata più volte.Perdita di memoria di chiusura e callback in javascript
Una soluzione è impostare bigObject
su null
quando il lavoro nella funzione di richiamata è terminato. Ma se stai usando molte variabili (immagina che ci siano n
variabili come bigObject
e che siano tutte utilizzate in callback), la pulizia di questo diventa un brutto problema.
La mia domanda è questa: c'è qualche altro modo per pulire quelle variabili utilizzate?
EDIT Ecco un altro esempio (reale): Così ottengo l'applicazione da mongodb e la confronta con qualche altra applicazione. La richiamata da mongodb utilizza un'applicazione variabile definita da tale callback. Dopo aver ottenuto il risultato da mongodb, lo restituisco anche come callback (perché è tutto asincrono e non posso scrivere solo return). Quindi, in realtà può accadere che i propago richiamata tutta la strada alla fonte ...
function compareApplications(application, condition, callback) {
var model = database.getModel('Application');
model.find(condition, function (err, applicationFromMongo) {
var result = (applicationFromMongo.applicationID == application.applicationID)
callback(result)
}
}
Lasciate che vi chieda questo - Perché questo è un problema ? Il gestore 'change' è pensato per essere chiamato più volte. Quindi, come mai tu (o il GC) saprai mai quando è veramente la fine dell'uso di 'bigObject' a meno che tu non disfaccia l'evento' change'? Sembra che vogliate un'istanza di 'bigObject' in modo che il gestore possa confrontare i tipi. La si istanzia una sola volta, riducendo il carico per ogni volta che viene eseguito il gestore. Se vuoi che venga ripulito, instanziarlo sempre all'interno del gestore, o aspettarti di "perdere" la memoria perché è così che funziona. – Ian
Che ne dici di usare .one() al posto di .on()? – frenchie
Si prega di notare che ho cambiato l'esempio. Nel mio programma del mondo reale non uso .on. Trasmetto la funzione di callback a un'altra. –