蓝鸟承诺和领域
Bluebird Promises and Domains
我在 bluebird promise 中抛出错误时遇到问题。取以下代码:
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!
。但是,该错误似乎并未在域内捕获,我在控制台中看到致命错误和堆栈跟踪。
有谁知道为什么?
异常实际上是由Bluebird 处理的。 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();
});
我在 bluebird promise 中抛出错误时遇到问题。取以下代码:
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!
。但是,该错误似乎并未在域内捕获,我在控制台中看到致命错误和堆栈跟踪。
有谁知道为什么?
异常实际上是由Bluebird 处理的。 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();
});