2013-04-10 8 views
5

La lettura della documentazione su http://nodejs.org/api/domain.html lo rende un po 'vago: "effettua il tentativo migliore per eliminare tutti gli I/O associati al dominio". Menziona che i timer sono chiusi, il che non è esattamente IO. Sarebbe molto bello conoscere l'elenco completo di cose che domain.dispose fa. Qualcuno ha quella lista?Che cosa fa esattamente domain.dispose() in nodejs? Ci sono dei ganci?

Inoltre, esiste un modo per collegarsi a tale funzionalità, ovvero consentire la chiamata di un codice di pulizia personalizzato quando viene eseguito domain.dispose()?

risposta

4

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; 
}; 
+1

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. –

+0

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

+0

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. –

Problemi correlati