2014-11-22 11 views
6

वादे के उपयोग पर नोडज गुरुओं से मदद मांगने के लिए। मेरे पास निम्न परीक्षण प्रोग्राम है, जिसमें मैं एक async "q" फ़ंक्शन का आह्वान करता हूं जो बस अपवाद फेंकता है। यह कार्यक्रम स्मृति को लगातार सुसंगत बनाता है; लेकिन अगर डोन() कॉल को असम्बद्ध करता है तो रिसाव दूर हो जाता है।नोडजेस - वादे, अनचाहे समाप्ति और स्मृति रिसाव

वादा समाप्त होने पर रिसाव क्यों होता है (यानी कोई नहीं किया गया) कॉल? मैंने documentation का पालन करने का प्रयास किया, लेकिन किए गए() विधि के स्पष्टीकरण को समझने में परेशानी है। आपकी सहायता के लिये पहले से ही धन्यवाद!

(function() { 
    var MAX_ITER_COUNT, Q, iterCount, maxMem, noop, qDoit, test; 

    Q = require("q"); 

    iterCount = 0; 

    MAX_ITER_COUNT = 10 * 1000; 

    maxMem = 0; 

    noop = function() {}; 

    qDoit = function() { 
    var currentMem; 
    currentMem = Math.round(process.memoryUsage().heapUsed/1024/1024); 
    if (currentMem > maxMem) { 
     maxMem = currentMem; 
    } 
    console.log("" + iterCount + " - memory is: " + currentMem + "/" + maxMem + " MB"); 
    return Q(10).then(function() { 
     throw new Error("X"); 
    }); 
    }; 

    test = function() { 
    if (iterCount++ > MAX_ITER_COUNT) { 
     console.log("DONE"); 
     return; 
    } 

    // ---- If I uncomment the done() call below the leak goes away ---- 
    return qDoit()["finally"](function() { 
     return setImmediate(test); 
    }) 
    //.done(noop, noop, noop); 


    }; 

    Q.onerror = function() {}; 

    test(); 

}).call(this); 
+0

आपने कैसे निर्धारित किया कि स्मृति रिसाव हो रहा है? यह भी उत्सुक है, किसी भी कारण से आप इस पूरी चीज़ को अज्ञात फ़ंक्शन में लपेट रहे हैं? –

+0

@torazaburo - console.log कॉल जो स्मृति उपयोग को मुद्रित करता है .done() कॉल के साथ लगातार निरंतर mem उपयोग की रिपोर्ट करता है, लेकिन जब मैं टिप्पणी करता हूं तो लगातार बढ़ता है .done()। एनन फ़ंक्शन - यह कॉफ़ी स्क्रिप्ट कंपाइलर द्वारा उत्पन्न होता है, जो कोड की इस शैली को सही ढंग से स्केल करने के लिए उत्पन्न करता है, वैश्विक नाम विवादों से रक्षा करता है। – PKK

+0

@torazaburo - यह कोई समस्या नहीं होनी चाहिए क्योंकि परीक्षण फ़ंक्शन सेट के माध्यम से निष्पादित किया जाता है() कहते हैं। – PKK

उत्तर

5

मेरे अपने प्रश्न का उत्तर देना उम्मीद है कि यह किसी को मदद मिलेगी,:

यहाँ मेरी कोड है।

q लाइब्रेरी कोड में थोड़ा सा खोदने पर, ऐसा लगता है कि सभी अनचाहे अपवादों को डिफ़ॉल्ट रूप से unhandledRejections नामक सरणी में रखा जाता है। यह सुनिश्चित नहीं है कि इसे इस तरह क्यों लागू किया गया था, लेकिन संभावित रूप से डेवलपर्स को अनचाहे अपवादों को ट्रैक करने में सहायता करने के लिए। Q.stopUnhandledRejectionTracking() पर कॉल करके यह व्यवहार बदला जा सकता है। जब मैंने ऐसा किया, तो मेमोरी रिसाव .done() कॉल के बिना भी चला गया।

+1

'unhandledRejections' सरणी इकाई परीक्षण उद्देश्यों के लिए प्रतीत होता है: https://github.com/kriskowal/q/issues/265 – PKK

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