域中的NodeJS抛出错误会停止全局执行吗?

时间:2014-01-22 22:49:45

标签: 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);
  // 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并看到“内部完成”消息。

0 个答案:

没有答案