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

B T*_*B T 6 javascript error-handling node.js

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

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

hex*_*ide 5

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

从Node文档:

一旦域被处置,dispose事件将发出.

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

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

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

这是来自节点:

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;
};
Run Code Online (Sandbox Code Playgroud)