使用throw-catch打破承诺链

时间:2020-03-16 14:12:25

标签: node.js promise

我需要检查该用户是否存在于两个数据库中,如果不存在,则必须创建一个新用户。

检查用户是否存在于数据库中1。 如果存在,则抛出一个“用户存在”并捕获它,而不执行其余的then()。

检查用户是否存在于数据库中2。 如果存在,则抛出一个“用户存在”并捕获它,而不执行其余的then()。

否则,如果没有,请创建用户。

我正试图打破承诺链。这是场景。 所以我所做的是

const promise = new Promise((resolve, reject) => {
       resolve(false); 

   }).then(value => {
         //check if user exists in table 1 and set value to True or False
         if (value==True){
             throw "User exists";
         }
         else{
              return value;
         }
   }).then(value=> {
      ////check if user exists in table 2 and set value to True or False
      if (value==True){
             throw "User exists";
         }
         else{
              return value;
         }
   }).catch(err => {
           console.log(err);
       });

这是它的简短外观。

但是即使我抛出一条消息,它也不会停止执行稍后的then()语句。即使找到了用户,它也会继续执行全部代码。

它还显示以下内容并停止整个执行。

                    throw 'user found'
                    ^

注意:获取用户值后,我需要处理它们。因此,不应停止执行。

1 个答案:

答案 0 :(得分:2)

使用return Promise.reject(new Error())代替抛出。顺便说一句-如果扔了,应该throw new Error('message')

但这是应​​该如何处理错误而不是代码执行的逻辑。

checkIfUserExistsInDB1() //this must be a function returning a promise
  .then(user => {
    if (!user) return checkIfUserExistsInDB2() //this must be a function returning a promise
    else return Promise.resolve(user)
  })
  .then(user => {
    if (!user) return createUser() //this must be a function returning a promise
    else return Promise.resolve(user)
  })
  .then(user=> { do whatever you need more })
  .catch(err => { handle error })