作为我正在开发的Node.js / Express API的一部分,我构建了一个自定义错误处理程序,可以在需要时抛出特定错误,例如: BadRequest或NotFound等。
当我希望在promise链中抛出时,会出现问题。例如:
db.doSomethingAsync().then(data => {
if(data.length === 0){
throw new errors.ResourceNotFound({ resource: "foo" });
}
});
经过对该主题的大量阅读后,我发现这个错误会被承诺所吞噬,从而导致未处理的Promise拒绝。
我知道我可以拒绝但是我不知道如何处理特定的错误(而不是我不想要的拒绝收集)。
另外,要拒绝,我不需要在我的承诺链中创建新的承诺吗?那感觉很乱。
有人可以建议如何处理在承诺链中抛出特定异常吗?
答案 0 :(得分:3)
除了第一次回调 then()(解析回调和接收数据)之外,您还可以提供第二次回调,即拒绝回调并收到错误。所以你可以在第二个回调中捕获这个特定的错误:
db
.doSomethingAsync()
.then(data => {
if(data.length === 0){
throw new errors.ResourceNotFound({ resource: "foo" });
}
})
.then(massagedData => {
// work with massagedData here
}, err => {
// handle err here which is previous thrown error
// assert.ok( err instanceof errors.ResourceNotFound() )
})
.catch(err => {
// this will catch unhandled errors if any
});
默认情况下,然后()会返回一个承诺,如果它的任何回调(无论是第一个还是第二个)都会抛出错误,那么它会返回一个拒绝的承诺,其原因将被下一个拒绝捕获回调如果有的话或最后的捕获。所以你不需要创造新的承诺。