为什么我的异步函数总是向包装函数返回 false?

时间:2021-06-21 20:24:28

标签: javascript asynchronous async-await amazon-cognito aws-amplify

我有一个异步函数,可以触发 AWS Amplify 向用户发送密码重置代码。

export async function forgotPassword(username) {
  console.log('forgotPassword')
  return Auth.forgotPassword(username)
    .then(data => {
      console.log('aws reset password request success')
      console.log(data)
    })
    .catch(error => {
      console.log('error with call to AWS forgotPassword fncn')
    })
}

这是一个调用上面函数的包装函数...

  forgotPassword(email).then(success => {
    if (success) {
      console.log('successful forgot password action')
      Vue.prototype.$notification.success({
        message: 'Forgot password action success',
        description: 'You have successfully submitted a password refresh request!',
      })
    }
    if (!success) {
      console.log('failed forgot password action')
    }
  })

我知道内部函数成功运行,因为我用于调试该方法的控制台日志语句确实执行并打印了 'aws reset password request success'

但是,我的包装函数总是检测到 aws 函数中的失败,因为我看到包装函数进入了 !success 子句。为什么是这样?我猜测内部 aws 函数中的异步等待代码存在语法错误


更新,根据我目前阅读的答案,我更新了我的内部函数如下。

export async function forgotPassword(username) {
  console.log('forgotPassword')
  try {
    const data = await Auth.forgotPassword(username)
    console.log('aws password reset request success')
    console.log(data)
    return true
  } catch (error) {
    console.log('error with call to AWS forgotPassword fncn')
    notification.warning({
      message: error.code,
      description: error.message,
    })
  }
}

它似乎工作正常。

1 个答案:

答案 0 :(得分:3)

这是因为第一个函数返回的 promise 解析为 undefined。当您将 .then 链接到初始承诺时,您应该确保返回承诺应该使用的值

    .then(data => {
      console.log('aws reset password request success')
      console.log(data)
      return data; // or: return true;
    })