【问题标题】:Promise that doesn't catch [duplicate]没有抓住的承诺[重复]
【发布时间】:2020-01-16 05:29:23
【问题描述】:

我正在执行一些 Prisma 请求,但我注意到一些 Promise 不起作用。

我知道我可以使用 async-await,但这应该可以。

prisma
  .user({ uid })
  .then(user => {
    if (Object.keys(user).length) throw 'error!'

    return prisma.updateUser({
      data: { money: user.money - 50 },
      where: { id: user.id }
    })
  })
  .then(user => {
    prisma
      .createLog({
        user: { connect: { id: user.id } },
        type: 'TICKET_BOUGHT',
        date: new Date()
      })
      .then(() => console.log('Ticket bought'))
  })
  .catch(error => console.error(error))

如果用户不存在,它应该抛出一个错误,而是运行第二个“then”。

【问题讨论】:

  • 当用户存在时是否会抛出错误?
  • 不,我已经测试过了
  • 好的,现在这很奇怪:第一个 'then' 甚至没有运行
  • @JuanM04 公开你的用户(参数)函数...
  • @EugeneSunic 是一个 Prisma 函数。它获取数据库的用户。 prisma.io

标签: javascript node.js prisma


【解决方案1】:

试试这个:

 if (!Object.keys(user).length) throw 'error!'

【讨论】:

  • 一个简短的解释比“试试这个”更有价值,后者实际上毫无意义
  • 我正在测试,不要问我为什么,没有任何效果
  • 请公开你的 .user({ uid }) 承诺
【解决方案2】:

if (Object.keys(user).length) throw 'error!'这意味着如果用户存在,因为object.keys函数将返回对象键的数组列表.length检查数组长度,

所以如果用户存在? Object.keys 将返回用户属性的数组列表,即平均长度将大于零,如果条件为真,则 throw 将运行,

如果用户不存在,Object.keys 将返回零,if(0) 等于 false,因此 throw 不会运行

在您的情况下,您应该检查 if( ! Object.keys(user).length )if( Object.keys(user).length === 0 ) 或者您可以检查 if( !user || user == {} )if( !user || !user.uid) 而不是 uid 您可以将其更改为任何必需的属性,并且您确信 100% 该属性将全部返回案例

【讨论】:

    猜你喜欢
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 2019-05-07
    • 2015-11-26
    • 2020-10-22
    • 2017-09-27
    相关资源
    最近更新 更多