Domain类


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 方法对 runbindintercept 方法而言就像其管道,用于设置活动域。它在域中设置 domain.activeprocess.domain,并通过域模块隐式推送域到域栈堆中(详见 domain.exit() 了解更多关于域栈堆的内容)。enter 调用隔断了异步调用链的开端和 I/O 操作绑定到域。

调用 enter 仅更改活动域,而不会改变域本身。enterexit 可以在单一域中调用任意次。

如果域的 enter 调用已经被释放,enter 会被返回而无需设置域。

domain.exit()

exit 方法退出当前域,弹出并关闭域栈堆。任何时候执行流程切换到一个不同的异步回调链的上下文时,需要确保当前域已经退出。exit 调用隔断了异步调用链的末端或中断异步调用链和 I/O 操作绑定到域。

如果有绑定到当前执行上下文多个嵌套域,exit 会退出嵌套在这个域内的任何域。

调用 exit 仅更改活动域,而不会改变域本身。enterexit 可以在单一域中调用任意次。

如果域的 exit 调用已经被释放,exit 会被返回而无需设置域。

domain.dispose()

稳定度:0 - 已废弃。请通过在域中明确地设置错误事件处理程序从失败的 IO 动作恢复。

一旦调用 dispose,该域将不可以再使用回调函数通过 runbindintercept 绑定到该域,并且会触发一个 'dispose' 事件。

results matching ""

    No results matching ""