domain.dispose()在nodejs中究竟做了什么?有钩子吗?

时间:2013-04-10 04:42:56

标签: javascript node.js error-handling

阅读http://nodejs.org/api/domain.html处的文档使其有点模糊:“尽最大努力尝试清理与域相关联的任何和所有IO”。它提到计时器已关闭,这不完全是IO。知道domain.dispose所做的全面的事情列表会很高兴。有人有这个清单吗?

此外,有没有办法挂钩该功能 - 即允许在运行domain.dispose()时调用一些自定义清理代码?

1 个答案:

答案 0 :(得分:5)

dispose函数调用exit和dispose函数,删除所有侦听器,删除所有错误处理程序,并尝试终止域的所有成员。检查域是否具有父级的函数,如果是,则从域中删除它。然后将域设置为垃圾收集,并将其标记为已处置。

来自Node文档:

  

处置域后,dispose事件将发出。

我会更深入地讨论这个主题,但Node源已经很好地注释了。

您正在谈论的计时器将在这里,正在迭代域的成员。

this.members.forEach(function(m) {
  // if it's a timeout or interval, cancel it.
  clearTimeout(m);
});

这是来自节点source

Domain.prototype.dispose = function() {
  if (this._disposed) return;

  // if we're the active domain, then get out now.
  this.exit();

  this.emit('dispose');

  // remove error handlers.
  this.removeAllListeners();
  this.on('error', function() {});

  // try to kill all the members.
  // XXX There should be more consistent ways
  // to shut down things!
  this.members.forEach(function(m) {
    // if it's a timeout or interval, cancel it.
    clearTimeout(m);

    // drop all event listeners.
    if (m instanceof EventEmitter) {
      m.removeAllListeners();
      // swallow errors
      m.on('error', function() {});
    }

    // Be careful!
    // By definition, we're likely in error-ridden territory here,
    // so it's quite possible that calling some of these methods
    // might cause additional exceptions to be thrown.
    endMethods.forEach(function(method) {
      if (typeof m[method] === 'function') {
        try {
          m[method]();
        } catch (er) {}
      }
    });

  });

  // remove from parent domain, if there is one.
  if (this.domain) this.domain.remove(this);

  // kill the references so that they can be properly gc'ed.
  this.members.length = 0;

  // finally, mark this domain as 'no longer relevant'
  // so that it can't be entered or activated.
  this._disposed = true;
};