【问题标题】:Break a promise chain using throw-catch使用 throw-catch 打破承诺链
【发布时间】:2020-03-16 14:12:25
【问题描述】:

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

检查用户是否存在于数据库 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'
                    ^

注意:在我得到用户值之后,我必须处理它们。所以不应该停止执行。

【问题讨论】:

  • 您使用的是哪个版本的 Node.js?

标签: node.js promise


【解决方案1】:

使用 return Promise.reject(new Error()) 代替 throw。顺便说一句 - 如果你扔你应该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 }) 

【讨论】:

  • 如果我使用拒绝,它会引发 UnhandledPromiseRejectionWarning 并且我可以抓住它,但整个错误仍然不断出现。是的,逻辑不应该这样处理。如果找到用户,您能否提出一种中断流程的方法?
  • 我在答案中添加了一个示例。你没有展示任何业务逻辑,所以这只是你需要什么的猜测
猜你喜欢
  • 1970-01-01
  • 2020-02-23
  • 2017-11-23
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 2015-06-12
相关资源
最近更新 更多