Асинхронная функция не ожидает Promise при вызове в другой функции - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть асинхронная функция, которая ожидает обещание:

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}] }

, но

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

Почему выполнение продолжается для isSenderValid и не дожидается разрешения Обещанияи как это исправить?

1 Ответ

0 голосов
/ 11 декабря 2018

Ваша 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, вы не можете вернуть ничего, что напрямую зависит от результата этого Обещания: все остальное также должно быть 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
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...