Javascript 异步函数在另一个函数中调用时不等待承诺
我有一个等待承诺的异步函数:Javascript 异步函数在另一个函数中调用时不等待承诺,javascript,promise,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 isSender
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
}
我一直认为异步函数将等待承诺解决它们所做的事情,有点:
// In file 1: { companies: [{obj}] }
但是
//在文件2中:Promise{}
为什么对
isSenderValid
继续执行,而不是等待承诺解决,以及如何修复它?您的getUserByImportMail
函数是异步的,这意味着它将返回一个Promise
作为mailResult
最终返回的内容。您应该使isSenderValid
也成为一个async
函数,然后它可以等待调用的结果:
const isSenderValid = async mail => {
const importMail = await getUserByImportMail({importMail: mail})
console.log("In file 2: " + inspect(importMail))
// some checks
return importMail
}
当然,任何调用isSenderValid
的函数本身都必须使用wait
,并且是一个async
函数。一路下来
或者,isSenderValid
可以直接使用Promise
,但在这种情况下,它不能返回importMail
。如果调用的函数是async
,即返回Promise
,则不能直接返回依赖于该承诺结果的任何内容:其他所有内容也必须是async
下面是如何处理isSenderValid
中的Promise
并返回另一个Promise
,它将解析为importMail
:
const isSenderValid = mail => {
return getUserByImportMail({importMail: mail})
.then(importMail => {
console.log("In file 2: " + inspect(importMail))
// some checks
return importMail
});
}
因为不存在可能重复的async
函数总是返回一个承诺-关键字就像函数的包装器一样工作。谢谢,你能详细说明一下这句话吗:或者isSenderValid可以直接使用承诺,但是在这种情况下,它不能返回importMail
?他的意思是你可以做->isSenderValid。然后(result=>..)
基本上就是承诺的回调版本,当然你也不能从回调中返回。IOW:一次async
总是async
,声音限制,但从长远来看这是一件好事当然,我正在更新我的答案,以包括承诺的例子。非常有用。因此,本质上,每个引用承诺返回值的函数要么也需要等待,要么就需要等待。
const isSenderValid = mail => {
return getUserByImportMail({importMail: mail})
.then(importMail => {
console.log("In file 2: " + inspect(importMail))
// some checks
return importMail
});
}