寻求有关使用承诺的nodejs专家的帮助。我有以下测试程序,我在其中调用异步" q"只抛出异常的函数。这个程序非常一致地泄漏内存;但如果取消注释.done()调用,泄漏就会消失。
为什么在未终止承诺(即没有完成()调用)时发生泄漏?我试图遵循documentation,但无法理解done()方法的解释。在此先感谢您的帮助!
这是我的代码:
(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 :(得分:6)
回答我自己的问题,希望它会对某人有所帮助。
在q
库代码中挖掘一下,默认情况下,所有未处理的异常看起来都放在一个名为unhandledRejections
的数组中。不知道为什么它是这样实现的,但可能是为了帮助开发人员追踪未处理的异常。可以通过调用Q.stopUnhandledRejectionTracking()
来更改此行为。当我这样做时,即使没有.done()
调用,内存泄漏也会消失。