Node.js 域中的NodeJS抛出错误是否停止全局执行?
给定如下设置:Node.js 域中的NodeJS抛出错误是否停止全局执行?,node.js,error-handling,Node.js,Error Handling,给定如下设置: 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)
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);
我得到了“done IN domain”消息和X现在为4的输出
但我希望域内的执行在该点停止,但在d.run()之后继续外部作用域。换句话说,我需要一个“Done!2
”行,显示域中的执行在x
为2时停止,并且外部上下文继续处理。可能吗?我尝试从d.on('error')
侦听器中调用d.dispose()
或d.exit()
,但这仍然导致x
为4,并看到“在域内完成”消息