Javascript 为什么node.js/bluebird会吃到一个异常?
在我的承诺堆深处,我打电话:Javascript 为什么node.js/bluebird会吃到一个异常?,javascript,node.js,bluebird,Javascript,Node.js,Bluebird,在我的承诺堆深处,我打电话: function isNameAvailable(name) { return registry.getName(name) .then(function(result) { return result ? false : true; }); } 不幸的是,这是一个编程错误,注册表未定义。我的node.js应用程序没有打印任何错误消息。你知道为什么吗?我正在使用蓝鸟承诺图书馆 编辑 这是电话号码。我只
function isNameAvailable(name) {
return registry.getName(name)
.then(function(result) {
return result ? false : true;
});
}
不幸的是,这是一个编程错误,注册表未定义。我的node.js应用程序没有打印任何错误消息。你知道为什么吗?我正在使用蓝鸟承诺图书馆
编辑
这是电话号码。我只是加了一个陷阱,但什么都没有
function _checkAvailability(name) {
return isNameAvailable(name)
.then(function(isAvailabile) {
if (isAvailabile) {
return true;
}
else {
throw new NameNotAvailable('Name "' + name + '" is not available');
}
})
.catch(function(error) {
console.log('isNameAvailable threw', error);
throw error;
})
}
堆栈最终应回滚到express.js因HTTP请求而调用的函数。这是一个我捕获所有错误并打印堆栈跟踪的地方(但显然它没有打印任何内容):
编辑以反映您的更新: Naresh是对的,您需要返回一个被拒绝的承诺,如果它抛出的话,它的名称是可用的。你可以试试
function isNameAvailable(name) {
try {
return registry.getName(name)
.then(function(result) {
return result ? false : true;
});
} catch(e){
return Promise.reject(e)
}
}
看到这篇文章,你会发现深深承诺中的错误
您打电话到哪里了
isnameavable
?它确实抛出了。你能分享更多你的代码吗?从这一点上,我想问题在于您没有捕获错误。请查看我对该代码调用方的编辑。isnameavable
会同步抛出一个异常。这不会在返回值的任何.catch()
处理程序中被捕获,因为您不会返回被拒绝的承诺-永远不会执行catch
方法。如果您执行类似于somePromise.then(isnameavable)
(或)的操作,则会捕获错误并将其转换为拒绝。然后(\u checkAvailability)
)好的,这是有意义的。因此,基本问题是由于编程错误,isnameavable
没有返回承诺,因此我们不能期望then
和catch
起作用。看来我根本不应该更改代码,而应该确保我能够调试这些问题。
function isNameAvailable(name) {
try {
return registry.getName(name)
.then(function(result) {
return result ? false : true;
});
} catch(e){
return Promise.reject(e)
}
}