Domain类
- domain.members
- domain.bind(callback)
- domain.intercept(callback)
- domain.run(fn[, arg][, ...])
- domain.add(emitter)
- domain.remove(emitter)
- domain.enter()
- domain.exit()
- domain.dispose()
domain.members
- {Array}
已明确添加到域的定时器和事件触发器列表。
domain.bind(callback)
callback
:{Function} 回调函数返回:{Function} 绑定函数
返回将提供的回调函数包装后的函数。当返回的函数被调用时,被抛出的任何错误都将被路由到该域的 'error'
的事件。
示例
const d = domain.create();
function readSomeFile(filename, cb) {
fs.readFile(filename, 'utf8', d.intercept((data) => {
// note, the first argument is never passed to the
// callback since it is assumed to be the 'Error' argument
// and thus intercepted by the domain.
// if this throws, it will also be passed to the domain
// so the error-handling logic can be moved to the 'error'
// event on the domain instead of being repeated throughout
// the program.
return cb(null, JSON.parse(data));
}));
}
d.on('error', (er) => {
// an error occurred somewhere.
// if we throw it now, it will crash the program
// with the normal line number and stack message.
});
domain.intercept(callback)
callback
:{Function} 回调函数返回:{Function} 拦截函数
此方法与 domain.bind(callback) 几乎是相同的。然而,除了捕获抛出的错误,它同样会拦截 Error 对象作为第一个函数的参数发送。
通过这种方式,通用的 if (err) return callback(err);
模式可以被替换为在相同地方的一个错误处理程序。
示例
const d = domain.create();
function readSomeFile(filename, cb) {
fs.readFile(filename, 'utf8', d.bind((er, data) => {
// if this throws, it will also be passed to the domain
return cb(er, data ? JSON.parse(data) : null);
}));
}
d.on('error', (er) => {
// an error occurred somewhere.
// if we throw it now, it will crash the program
// with the normal line number and stack message.
});
domain.run(fn[, arg][, ...])
fn
:{Function}
在域环境中运行所提供的函数,隐式绑定所有的事件触发器、计时器和在这种情况下创建的低频率的请求。可选的,参数可以被传递给该函数。
这是使用一个域的最基本的方法。
例子:
const domain = require('domain');
const fs = require('fs');
const d = domain.create();
d.on('error', (er) => {
console.error('Caught error!', er);
});
d.run(() => {
process.nextTick(() => {
setTimeout(() => { // simulating some various async stuff
fs.open('non-existent file', 'r', (er, fd) => {
if (er) throw er;
// proceed...
});
}, 100);
});
});
domain.add(emitter)
emitter
:{EventEmitter} | {Timer} 被添加到域的事件触发器或计时器。
显式添加一个触发器到域。如果任何由触发器调用的事件处理程序抛出一个错误,或触发器触发了一个 'error'
事件,它会被路由到域的 'error'
事件,如同隐式绑定。
这也适用于从 setInterval() 和 setTimeout() 返回的定时器。如果它们的回调函数抛出了错误,那么它们会被域的 'error'
处理器捕捉到。
如果 Timer 或 EventEmitter 已经绑定到域,它会移那个,并绑定该处理器来代替它。
domain.remove(emitter)
emitter
:{EventEmitter} | {Timer} 从域中移除的事件触发器或计时器。
这是 domain.add(emitter) 的反操作。从指定的触发器中移除域处理器。
domain.enter()
enter
方法对 run
、bind
和 intercept
方法而言就像其管道,用于设置活动域。它在域中设置 domain.active
和 process.domain
,并通过域模块隐式推送域到域栈堆中(详见 domain.exit() 了解更多关于域栈堆的内容)。enter
调用隔断了异步调用链的开端和 I/O 操作绑定到域。
调用 enter
仅更改活动域,而不会改变域本身。enter
和 exit
可以在单一域中调用任意次。
如果域的 enter
调用已经被释放,enter
会被返回而无需设置域。
domain.exit()
exit
方法退出当前域,弹出并关闭域栈堆。任何时候执行流程切换到一个不同的异步回调链的上下文时,需要确保当前域已经退出。exit
调用隔断了异步调用链的末端或中断异步调用链和 I/O 操作绑定到域。
如果有绑定到当前执行上下文多个嵌套域,exit
会退出嵌套在这个域内的任何域。
调用 exit
仅更改活动域,而不会改变域本身。enter
和 exit
可以在单一域中调用任意次。
如果域的 exit
调用已经被释放,exit
会被返回而无需设置域。
domain.dispose()
稳定度:0 - 已废弃。请通过在域中明确地设置错误事件处理程序从失败的 IO 动作恢复。
一旦调用 dispose
,该域将不可以再使用回调函数通过 run
、bind
或 intercept
绑定到该域,并且会触发一个 'dispose'
事件。