2013-04-10 6 views
5

http://nodejs.org/api/domain.html पर प्रलेखन को पढ़ना थोड़ा अस्पष्ट बनाता है: "डोमेन डोमेन से जुड़े किसी भी और सभी आईओ को साफ़ करने का सबसे अच्छा प्रयास करने का प्रयास करता है"। यह उल्लेख करता है कि टाइमर बंद हो जाते हैं, जो बिल्कुल आईओ नहीं है। डोमेन.dispose की चीजों की व्यापक सूची जानना बहुत अच्छा होगा। क्या किसी के पास यह सूची है?डोमेन.dispose() nodejs में क्या करता है? क्या कोई हुक है?

इसके अलावा, क्या उस कार्यक्षमता में हुक करने का कोई तरीका है - यानी डोमेन डिस्प्ले() चलाए जाने पर कुछ कस्टम क्लीन अप कोड को कॉल करने की अनुमति दें?

उत्तर

4

निपटान समारोह बाहर निकलने और कार्यों का निपटान करने, सभी श्रोताओं को हटा देता है, सभी त्रुटि हैंडलर को हटा देता है, और डोमेन के सभी सदस्यों को मारने का प्रयास करता है। यदि डोमेन में माता-पिता हैं, और यदि ऐसा होता है तो चेक चेक करता है, तो इसे डोमेन से निकाल दिया जाता है। डोमेन को कचरा संग्रह के लिए सेट किया जाता है, और डिस्पोजेड के रूप में चिह्नित किया जाता है।

नोड प्रलेखन से:

एक बार डोमेन निपटान किया जाता है निपटाने घटना फेंकना होगा।

मैं इस विषय पर अधिक गहराई से जाऊंगा, लेकिन नोड स्रोत पहले ही अच्छी तरह से एनोटेटेड है।

जिस टाइमर के बारे में आप बात कर रहे हैं वह यहां होगा, जहां डोमेन के सदस्यों को फिर से चालू किया जा रहा है।

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

तो लग रहा है "निपटाने" घटना की तरह हुक मैं के बारे में सोच रहा था हो सकता है। अजीब लगता है कि वे जांच नहीं करते हैं कि क्या सदस्य उस पर स्पष्ट टाइमआउट का उपयोग करने से पहले एक टाइमआउट है या नहीं। यह थोड़े गलत लगता है कि वे अंत से अनजान अपवाद छिपाते हैं। "डोमेन सदस्य" बनने वाली चीजों का सेट क्या है? कस्टम ऑब्जेक्ट्स डोमेन सदस्य बनने का कोई तरीका है? स्रोत इसके बारे में स्पष्ट नहीं है। –

+0

हाँ, वे विधियां बहुत साफ नहीं लगती हैं, हालांकि मैं बहुत अनुभवी कोडर नहीं हूं इसलिए मुझे बहुत बेहतर पता नहीं है। मेरे पास एक सवाल है - आप किस प्रकार की कस्टम ऑब्जेक्ट्स के बारे में बात कर रहे हैं? एक सदस्य किसी भी प्रकार का 'EventEmitter' है, क्योंकि डोमेन विशेष रूप से एक समूह के रूप में एकाधिक I/O संचालन को संभालते हैं। – hexacyanide

+0

कस्टम ऑब्जेक्ट्स जो मैं बात कर रहा हूं वे वास्तव में कुछ भी हैं जो आप सोच सकते हैं। एक उदाहरण कुछ मालिकाना प्रोटोकॉल पर टीसीपी संचार को संभालने के लिए कुछ मॉड्यूल है। प्रोटोकॉल द्वारा उन त्रुटियों के मामले में अपेक्षित कुछ विशिष्ट संदेश हो सकते हैं जिन्हें आप निपटान() के माध्यम से मरने से पहले भेजना चाहते हैं। यह सुनिश्चित करने में सक्षम होना अच्छा होगा कि आपकी कस्टम सामग्री कोर आईओ कार्यक्षमता और इसी तरह के रूप में स्पष्ट रूप से डिस्पोजेबल है। –

संबंधित मुद्दे