阅读http://nodejs.org/api/domain.html处的文档使其有点模糊:“尽最大努力尝试清理与域相关联的任何和所有IO”。它提到计时器已关闭,这不完全是IO。知道domain.dispose所做的全面的事情列表会很高兴。有人有这个清单吗?
此外,有没有办法挂钩该功能 - 即允许在运行domain.dispose()时调用一些自定义清理代码?
答案 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;
};