寻求nodejs专家对使用承诺的帮助。我有以下测试程序,其中我调用异步“q”函数,只是抛出一个异常。这个程序相当一致地泄漏内存;但如果取消注释.done()调用,泄漏消失。Nodejs - 承诺,未处理的终止和内存泄漏
为什么泄漏发生在承诺未终止时(即没有完成()调用)?我试图遵循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);
您是如何确定发生内存泄漏的?也只是好奇,任何理由你把这整个事情包装在一个匿名函数中? – 2014-11-22 18:18:17
@torazaburo - 打印内存使用情况报告的console.log调用使用.done()调用非常不变的内存使用情况,但在注释掉.done()时一直增长。匿名函数 - 这是由咖啡脚本编译器生成的,它产生这种风格的代码来正确地为变量作用域,避免全局名称冲突等。 – PKK 2014-11-22 18:28:20
@torazaburo - 这应该不是问题,因为测试函数是通过setImmediate()呼叫。 – PKK 2014-11-22 19:10:56