给出这样的设置:
var domain = require('domain');
// Keep the script running, even after main context actions are done
setInterval(function() {
console.log('Ping!');
}, 2000);
var d = domain.create();
d.on('error', function(er) {
console.log('error', er);
// Don't re-throw the error, to continue execution
});
var x = 0;
d.run(function() {
x = 1;
x = 2;
throw new Error('Stop!');
x = 3;
x = 4;
console.log('done inside domain');
});
console.log('Done!', x);
正如预期的那样,抛出的错误被域的“on('error')
”侦听器捕获,执行继续“Ping!”消息,直到你杀死进程。
我预计“内部域内完成”消息永远不会出现,但我很惊讶地发现“完成了!”消息和x
的最终输出未显示。
如果我改为使用事件:
var domain = require('domain');
var events = require('events');
var util = require('util');
setInterval(function() {
console.log('Ping!');
}, 2000);
var MyWorker = function MyWorker() {
events.EventEmitter.call(this);
};
util.inherits(MyWorker, events.EventEmitter);
var d = domain.create();
d.on('error', function(er) {
console.log('error', er);
});
var x = 0;
d.run(function() {
x = 1;
x = 2;
var w = new MyWorker();
w.emit('error', new Error('Stop!'));
x = 3;
x = 4;
console.log('done inside domain');
});
console.log('Done!', x);
我得到了“内部域内完成”消息,以及X现在为4的输出。
但我想要的是在域内执行以在此时停止,但在d.run()
之后继续外部范围。换句话说,我想要一个“Done! 2
”行,表示当x
为2时域中的执行停止,并且外部上下文继续处理。那可能吗?我尝试在d.dispose()
听众中调用d.exit()
或d.on('error')
,但这仍然会导致x
为4并看到“内部完成”消息。