वादे के उपयोग पर नोडज गुरुओं से मदद मांगने के लिए। मेरे पास निम्न परीक्षण प्रोग्राम है, जिसमें मैं एक 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);
आपने कैसे निर्धारित किया कि स्मृति रिसाव हो रहा है? यह भी उत्सुक है, किसी भी कारण से आप इस पूरी चीज़ को अज्ञात फ़ंक्शन में लपेट रहे हैं? –
@torazaburo - console.log कॉल जो स्मृति उपयोग को मुद्रित करता है .done() कॉल के साथ लगातार निरंतर mem उपयोग की रिपोर्ट करता है, लेकिन जब मैं टिप्पणी करता हूं तो लगातार बढ़ता है .done()। एनन फ़ंक्शन - यह कॉफ़ी स्क्रिप्ट कंपाइलर द्वारा उत्पन्न होता है, जो कोड की इस शैली को सही ढंग से स्केल करने के लिए उत्पन्न करता है, वैश्विक नाम विवादों से रक्षा करता है। – PKK
@torazaburo - यह कोई समस्या नहीं होनी चाहिए क्योंकि परीक्षण फ़ंक्शन सेट के माध्यम से निष्पादित किया जाता है() कहते हैं। – PKK