我有一个等待诺言的异步函数:
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解决,以及如何解决该问题?
答案 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
});
}