“未处理的承诺拒绝”的诺言链抓
问题描述:
,我发现了异常:“未处理的承诺拒绝”的诺言链抓
(节点:1356)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:1):无法出具发票
编辑费用
我的代码使用承诺链来更新一些数据。它首先使用getExpense
获取数据库版本,然后检查用户是否允许编辑它(它不是issued
)。如果已发布,则拒绝承诺,如果不是,则继续执行update
,然后再次使用getExpense
获取更新的数据,以便将其返回。
但是,如果使用'已发布'费用运行,更新会通过并出现上述错误。消息“上发出的发票不能编辑费用”拒绝的预期,但它为什么被抓?:
expensesModels.getExpense(expense.id)
.then(validatedExpense => {
if (validatedExpense.issued) {
Promise.reject('Cannot edit expense on issued invoice');
} else {
Promise.resolve();
}
})
.then(() => expensesModels.update(expense))
.then(() => expensesModels.getExpense(expense.id))
.then(returnExpense => response.json(returnExpense))
.catch(err => errorHandling.onError(err, response));
我明白,当有没有一个catch
终止承诺链这个错误造成的,但我为了拒绝最后一行中的HTTP请求而捕获。
答
您没有从您的第一个.then
返回Promise.reject
。
答
为了继续'then'链,'promise.resolve()'在返回的值上被调用。由于你的第一个函数没有返回'promise.reject()',所以'promise.resolve()'被视为返回值,并且链进展而没有捕获错误。
Argh。我怎么没有发现这一点。谢谢 – Joe
这似乎是正确的答案。另外请注意,您可以编写'then(validatedExpense => {if(validatedExpense.issued){throw new Error('Can not edit expense on issued invoice');}})'不需要其他块或新的承诺。 – Jaime