在另一个函数中调用时,异步函数不等待Promise

时间:2018-12-11 10:00:07

标签: javascript promise

我有一个等待诺言的异步函数:

const getUserByImportMail = async (mail) => {
  const mailResult = await client.request(GET_COMPANY_BY_IMPORT_MAIL, mail)

  console.log("In file 1: " + inspect(mailResult))

  return mailResult
}

和另一个文件中的另一个函数对此文件进行一些检查:

const isSenderValid = mail => {
  const importMail = getUserByImportMail({importMail: mail})

  console.log("In file 2: " + inspect(importMail))

  // some checks
  return importMail
}

我一直认为异步函数会等待Promise解决它们的问题,有点:

// In file 1: { companies: [{obj}] }

但是

// In file 2: Promise { <pending> }

为什么isSenderValid继续执行,而不是等待Promise解决,以及如何解决该问题?

1 个答案:

答案 0 :(得分:3)

您的getUserByImportMail函数是异步的,这意味着它将为最终返回为Promise的内容返回一个mailResult。您应该使isSenderValid也是一个async函数,然后它才能await的调用结果:

const isSenderValid = async mail => {
  const importMail = await getUserByImportMail({importMail: mail})

  console.log("In file 2: " + inspect(importMail))

  // some checks
  return importMail
}

然后,当然,任何调用isSenderValid都必须使用await并成为async函数本身。一路下滑。

或者isSenderValid可以直接使用Promise,但是在这种情况下,它不能返回importMail。如果您调用的函数是async,即返回Promise,那么您将无法返回直接依赖于Promise结果的任何内容:其他所有内容也必须为async

以下是处理Promise内的isSenderValid并返回另一个Promise并将其解析为importMail的方式:

const isSenderValid = mail => {
  return getUserByImportMail({importMail: mail})
  .then(importMail => {
      console.log("In file 2: " + inspect(importMail))

      // some checks
      return importMail
  });
}