根据承诺的结果抛出错误

时间:2018-02-17 06:52:16

标签: javascript asynchronous promise

虽然满足条件,但以下代码不会处理错误。请帮助理解原因

编辑:以下代码现在在满足条件的情况下终止代码流,但在未处理的拒绝中抛出错误结果。

utils.js

const isMaximum = Id => {
 return db.Entries
   .findAndCountAll()
   .then(counts => {
     let numberOfEntries = 2;
     let maxEntries = 2;
       if (numberOfEntries == maxEntries) {
         return true;
       }
       else{
         return false;
       }
     });
};

xyz.js

const doSomething=(req,res,next)=>{
    Utils.isMaximum(id).then(isLimit=> {

           if(isLimit) throw new Error("not allowed"); //unhandled rejection
         //rest of code gets terminated as expected
 });
}

相关问题Why can I not throw inside a Promise.catch handler?无法找到解决方案。所以请说清楚。

2 个答案:

答案 0 :(得分:2)

.catch()处理程序内部抛出会使承诺链成为被拒绝的承诺。如果您没有后续的.catch()处理程序,那么它将被报告为未处理的promise rejction,因为之后没有.catch()来捕获被拒绝的promise。这几乎总是一个编程错误,这就是你收到警告的原因。

.catch()内投掷并不会终止您的计划。这个例外由承诺基础设施捕获(并变成被拒绝的承诺)。这就是承诺的工作方式(按规范)。如果您希望程序在此时终止,那么您可以调用process.exit()而不是抛出。

现在你已经编辑了你的问题,现在你正试图进入.then()处理程序。好。我会解决你添加的内容。下次请从整个代码上下文开始,以便我们更快地了解情况。

Utils.isMaximum()是异步的。它返回一个承诺。您需要使用异步技术进行编程。你不能想像同步顺序代码。调用Utils.isMaximum()后出现的任何代码都将在调用.then()处理程序之前执行。

这是一个简单的例子:

Utils.isMaximum(id).then(isLimit => {
   console.log("A");
});
console.log("B");

那将输出:

B
A

因此,对于初学者来说,你不能阻止.then()块之后的代码运行.then()块内的任何内容,因为函数的其余部分在{{{{}}之前执行1}}处理程序。

因此,您处理的常用方法是将其余代码放在.then()处理程序中或在您从中调用的函数中:

.then()

答案 1 :(得分:0)

我没有抓到我抛出的错误,这是唯一的原因。以下解决了。

np.warnings.filterwarnings('ignore')