2017-08-02 127 views
-1

,我发现了异常:“未处理的承诺拒绝”的诺言链抓

(节点: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请求而捕获。

回答

0

您没有从您的第一个.then返回Promise.reject

+0

Argh。我怎么没有发现这一点。谢谢 – Joe

+0

这似乎是正确的答案。另外请注意,您可以编写'then(validatedExpense => {if(validatedExpense.issued){throw new Error('Can not edit expense on issued invoice');}})'不需要其他块或新的承诺。 – Jaime

0

为了继续'then'链,'promise.resolve()'在返回的值上被调用。由于你的第一个函数没有返回'promise.reject()',所以'promise.resolve()'被视为返回值,并且链进展而没有捕获错误。

相关问题