Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 异步函数在另一个函数中调用时不等待承诺_Javascript_Promise - Fatal编程技术网

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
  });
}