2016-04-06 216 views
1

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

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!。但是,似乎错误没有被捕获到域内,我在控制台中看到一个致命的错误和堆栈跟踪。

有谁知道为什么?

+1

域已弃用,您不应该使用它们。 –

+0

这不是很有帮助。是的,我明白域名可能会在未来被替换,但是在要求弃用它们两年之后的今天,它们仍然是核心。由于没有任何物品可以替代它们提供的特定功能,因此域仍处于待弃用状态。 –

+0

这是蓝鸟的问题,Q库函数的预期如预期。 –

回答

1

蓝鸟实际上正在处理异常。 Promise拒绝与未处理的异常不同。如果您在setTimeout内部创建一个真正的未处理的异常,那么Bluebird将不会处理它,因为它将位于不同的堆栈上,您的域将按预期工作。

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(); 
    }); 
+0

很好的答案。这无疑更好地使用process.nextTick? –

+0

process.nextTick可能会更好,我忘记了setTimeout和nextTick之间的细微差别 –