La funzione di eliminazione chiama le funzioni di uscita e di eliminazione, rimuove tutti i listener, rimuove tutti i gestori di errori e tenta di uccidere tutti i membri del dominio. La funzione controlla se il dominio ha un genitore e se lo fa, viene rimosso dal dominio. Il dominio viene quindi impostato per la garbage collection e il segno come eliminato.
Dalla documentazione Nodo:
Una volta che il dominio è disposto l'evento smaltire emetterà.
Vorrei approfondire l'argomento, ma la sorgente del nodo è già ben annotata.
Il timer di cui si sta parlando sarebbe qui, dove vengono passati i membri del dominio.
this.members.forEach(function(m) {
// if it's a timeout or interval, cancel it.
clearTimeout(m);
});
Ecco dal Nodo source:
Domain.prototype.dispose = function() {
if (this._disposed) return;
// if we're the active domain, then get out now.
this.exit();
this.emit('dispose');
// remove error handlers.
this.removeAllListeners();
this.on('error', function() {});
// try to kill all the members.
// XXX There should be more consistent ways
// to shut down things!
this.members.forEach(function(m) {
// if it's a timeout or interval, cancel it.
clearTimeout(m);
// drop all event listeners.
if (m instanceof EventEmitter) {
m.removeAllListeners();
// swallow errors
m.on('error', function() {});
}
// Be careful!
// By definition, we're likely in error-ridden territory here,
// so it's quite possible that calling some of these methods
// might cause additional exceptions to be thrown.
endMethods.forEach(function(method) {
if (typeof m[method] === 'function') {
try {
m[method]();
} catch (er) {}
}
});
});
// remove from parent domain, if there is one.
if (this.domain) this.domain.remove(this);
// kill the references so that they can be properly gc'ed.
this.members.length = 0;
// finally, mark this domain as 'no longer relevant'
// so that it can't be entered or activated.
this._disposed = true;
};
Così si presenta come l'evento "smaltire" potrebbe essere il gancio mi chiedevo circa. Sembra strano che non controllino se il membro è un timeout prima di usare clearTimeout su di esso. Sembra un torto nascondere le eccezioni non rilevate dagli endMethods che eseguono. Quali sono le cose che diventano "membri del dominio"? C'è un modo per rendere gli oggetti personalizzati diventare un membro del dominio? La fonte non è chiara al riguardo. –
Sì, quei metodi non sembrano molto puliti, anche se non sono un programmatore esperto, quindi non lo so molto meglio. Ho una domanda: di che tipo di oggetti personalizzati stai parlando? Un membro è un qualsiasi tipo di "EventEmitter', poiché i domini sono specificatamente utilizzati per gestire più operazioni di I/O come un singolo gruppo. – hexacyanide
Gli oggetti personalizzati di cui sto parlando sono davvero tutto ciò che si potrebbe pensare. Un esempio è un modulo per la gestione della comunicazione TCP su un protocollo proprietario. Potrebbero esserci alcuni messaggi specifici previsti dal protocollo in caso di errori che si desidera inviare prima di morire tramite dispose(). Sarebbe bello essere in grado di assicurarsi che le tue cose personalizzate siano altrettanto pulite come funzionalità di I/O principale e simili. –