2013-04-10 13 views
5

http://nodejs.org/api/domain.htmlでドキュメントを読むと、少し曖昧になります。「は、ドメインに関連付けられているすべてのIOをクリーンアップしようとします。タイマーはシャットダウンされていますが、これは正確にはIOではありません。 domain.disposeが行うことの包括的なリストを知ることは非常にうれしいでしょう。誰もそのリストを持っていますか?node.dispose()はnodejで正確に何をしますか?フックはありますか?

また、その機能にフックする方法はありますか?つまり、domain.dispose()を実行したときにカスタムクリーンアップコードを呼び出すことができますか?

答えて

4

dispose関数は、exit関数とdispose関数を呼び出し、すべてのリスナーを削除し、すべてのエラーハンドラを削除し、ドメインのすべてのメンバーを強制終了しようとします。この関数は、ドメインに親があるかどうかをチェックし、存在する場合はドメインから削除されます。次に、ドメインはガベージコレクションのために設定され、マークされたものは廃棄されます。ノードのドキュメントから

:ドメインが配置されたら

にdisposeイベントが出力されます。

トピックについて詳しく説明しますが、Nodeソースにはすでにアノテーションが正しく付けられています。

あなたが話しているタイマーは、ドメインのメンバーが反復されているところです。ここで

this.members.forEach(function(m) { 
    // if it's a timeout or interval, cancel it. 
    clearTimeout(m); 
}); 

は、ノード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

「処分」イベントは私が思っていたフックであるかもしれないようなので、見えます。メンバーがclearTimeoutを使用する前にタイムアウトになっているかどうかをチェックしないのは不思議です。彼らは彼らが実行するendMethodsからキャッチされていない例外を隠すことはちょっと間違っているようです。 「ドメインメンバー」になるものは何ですか?カスタムオブジェクトをドメインメンバーにする方法はありますか?その原因は明らかではない。 –

+0

ええ、それらのメソッドは非常にきれいに見えませんが、私は非常に経験豊富なコーダーではないので、よく分かりません。私は質問をしています - どのタイプのカスタムオブジェクトについて話していますか?ドメインは、複数のI/O操作を単一のグループとして処理するために特別に使用されるため、メンバーは任意のタイプの 'EventEmitter 'です。 – hexacyanide

+0

私が話しているカスタムオブジェクトは、あなたが考えることができるものです。 1つの例は、独自のプロトコルでTCP通信を処理するためのモジュールです。 dispose()によって死に至る前に送信したいエラーの場合、プロトコルによって予期されるいくつかの特定のメッセージが存在する可能性があります。カスタムのものがコアIO機能などと同様にきれいに使い捨てであることを確認することができればうれしいでしょう。 –

関連する問題