我注意到如果.then()
回调由于任何错误(例如对未定义变量的操作)而失败并且没有关联.catch()
,则会自动忽略该错误。
这在发展过程中非常不舒服。
例如,此代码将退出而不显示任何错误:
var Q = require('q');
var promise = Q('something');
promise
.then(function() {
buggyCode();
})
可能的解决方法是手动添加这样的错误处理程序,但是没有内置的内容吗?
.catch(function(error) {
console.error(error.stack);
})
答案 0 :(得分:3)
Apparently this is a limitation of Q
为了使错误处理稍微冗长,有方法.done()
,应该在所有其他处理程序之后调用并执行错误报告,类似于我在问题中发布的代码段。
这不完美,因为它需要每个承诺 - 消费者功能调用.done()
才能使此检查有效。
答案 1 :(得分:1)
这不一定是Q的限制。
您的原始示例使用的then()
没有catch()
,这有点像Q的反模式。then()
旨在消耗任何拒绝或抛出错误,返回拒绝承诺自己;这就是为什么你必须“catch()
”被拒绝的承诺,或者它会消失在虚空中:
someFn()
.then(doStuff)
.catch(handleError)
如果您的目标是允许抛出异常,done()
is intended for this purpose,因为它会冒出其处理程序中抛出的任何错误,从而允许更传统的错误处理方法:
try {
someFnThatGeneratesAnError().done()
} catch(e) { ... }
As you mentioned,在done()
之后需要catch()
来表示错误处理程序可能抛出的任何异常,但是Q has a global onerror
属性允许您提供处理程序对于未处理done()
的情况,您可以从单个调用中省略此项,并根据需要全局捕获它们。
Here is an example显示使用catch()
和onerror
进行错误处理,同时显示then()
如何处理与done()
相关的错误。