蓝鸟承诺和域名

我有一个在蓝鸟承诺中抛出一个错误的问题。 采取以下代码:

var Promise = require('bluebird'); var domain = require('domain'); var problem = function() { return new Promise(function(resolve, reject){ reject(new Error('Oops!')); }); }; domain.create() .on('error', function(e){ console.log("Caught Error " + e.message) process.exit(1); }) .run(function() { problem().done(); }); 

我希望看到Caught Error Oops! 在控制台。 但是,似乎错误没有被捕获到域内,我在控制台中看到一个致命的错误和堆栈跟踪。

有谁知道为什么?

蓝鸟实际上正在处理这个例外。 Promise拒绝与未处理的exception不一样。 相反,如果在setTimeout创build一个真正的未处理的exception,那么Bluebird将无法处理这个exception,因为它将位于不同的堆栈上,您的域将按预期工作。

 var Promise = require('bluebird'); var domain = require('domain'); var problem = function() { return new Promise(function(resolve, reject){ setTimeout(function() { throw new Error('boom!'); }, 1) }); }; domain.create() .on('error', function(e){ console.log("Caught Error " + e.message) process.exit(1); }) .run(function() { problem().done(); });