Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Nodejs-承诺、未处理的终止和内存泄漏_Javascript_Node.js_Memory_Promise - Fatal编程技术网

Javascript Nodejs-承诺、未处理的终止和内存泄漏

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

在承诺的使用上寻求nodejs大师的帮助。我有下面的测试程序,在其中调用一个异步“q”函数,该函数只抛出一个异常。这个程序一直在泄漏内存;但是如果取消对.done()调用的注释,泄漏就会消失

当承诺未终止时(即没有完成()调用),为什么会发生泄漏?我试图遵循,但在理解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);

回答我自己的问题,希望它能帮助别人


q
库代码中挖掘一点,默认情况下,所有未处理的异常都被放入一个名为
unhandledRejections
的数组中。不确定为什么会这样实现,但可能是为了帮助开发人员跟踪未处理的异常。通过调用
Q.stopUnhandledRejectionTracking()
可以更改此行为。当我这样做时,内存泄漏消失了,即使没有调用
.done()

您是如何确定内存泄漏正在发生的?还有一点很奇怪,你为什么要把这整件事包装在一个匿名函数中?@torazaburo-打印内存使用情况的console.log调用使用.done()调用报告相当稳定的内存使用情况,但当我注释掉.done()时,它会持续增长。Anon函数-这是由coffee脚本编译器生成的,它生成这种类型的代码来正确地定义变量的作用域,防止全局名称冲突等@torazaburo-这不应该是一个问题,因为测试函数是通过setImmediate()调用执行的。这绝对是一个问题-请打开一个。只是想知道-蓝鸟承诺会导致类似的泄漏吗?
unhandledRejections
数组似乎用于单元测试目的: