Javascript Nodejs-承诺、未处理的终止和内存泄漏
在承诺的使用上寻求nodejs大师的帮助。我有下面的测试程序,在其中调用一个异步“q”函数,该函数只抛出一个异常。这个程序一直在泄漏内存;但是如果取消对.done()调用的注释,泄漏就会消失 当承诺未终止时(即没有完成()调用),为什么会发生泄漏?我试图遵循,但在理解done()方法的解释时遇到困难。提前感谢您的帮助 这是我的密码:Javascript Nodejs-承诺、未处理的终止和内存泄漏,javascript,node.js,memory,promise,Javascript,Node.js,Memory,Promise,在承诺的使用上寻求nodejs大师的帮助。我有下面的测试程序,在其中调用一个异步“q”函数,该函数只抛出一个异常。这个程序一直在泄漏内存;但是如果取消对.done()调用的注释,泄漏就会消失 当承诺未终止时(即没有完成()调用),为什么会发生泄漏?我试图遵循,但在理解done()方法的解释时遇到困难。提前感谢您的帮助 这是我的密码: (function() { var MAX_ITER_COUNT, Q, iterCount, maxMem, noop, qDoit, test; Q
(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);
回答我自己的问题,希望它能帮助别人
在
q
库代码中挖掘一点,默认情况下,所有未处理的异常都被放入一个名为unhandledRejections
的数组中。不确定为什么会这样实现,但可能是为了帮助开发人员跟踪未处理的异常。通过调用Q.stopUnhandledRejectionTracking()
可以更改此行为。当我这样做时,内存泄漏消失了,即使没有调用.done()
您是如何确定内存泄漏正在发生的?还有一点很奇怪,你为什么要把这整件事包装在一个匿名函数中?@torazaburo-打印内存使用情况的console.log调用使用.done()调用报告相当稳定的内存使用情况,但当我注释掉.done()时,它会持续增长。Anon函数-这是由coffee脚本编译器生成的,它生成这种类型的代码来正确地定义变量的作用域,防止全局名称冲突等@torazaburo-这不应该是一个问题,因为测试函数是通过setImmediate()调用执行的。这绝对是一个问题-请打开一个。只是想知道-蓝鸟承诺会导致类似的泄漏吗?unhandledRejections
数组似乎用于单元测试目的: