Сохранение значения обещания в переменную не разрешается nodejs - PullRequest
0 голосов
/ 24 апреля 2020

, поэтому я уже некоторое время борюсь с этой проблемой, и мне нужна помощь. Итак, сначала у меня есть вызов API, который выглядит следующим образом:

async function getJoke() {
  try {
    const res = await axios({
      "method": "GET",
      "url": "https://matchilling-chuck-norris-jokes-v1.p.rapidapi.com/jokes/random",
      "headers": {
        "content-type": "application/octet-stream",
        "x-rapidapi-host": "matchilling-chuck-norris-jokes-v1.p.rapidapi.com",
        "x-rapidapi-key": "**********",
        "accept": "application/json"
      }
    })

    return res.data.value

  } catch (err) {
    console.log(err)
  }
}

Затем у меня есть свой индекс, где я вызываю эту функцию и пытаюсь присвоить возвращаемое значение переменной, которая будет использоваться:

async function tellJoke() {
    let joke = await getJoke()
    return joke
}

const data = tellJoke()
console.log(data)

console.log (data) возвращает ожидающее обещание, а не возвращаемое значение, как ожидалось, что я делаю не так? Спасибо.

Ответы [ 3 ]

0 голосов
/ 24 апреля 2020

Функция async возвращает Promise, поэтому вам нужно дождаться функции tellJoke().

Если вы используете функцию async, вам нужно только const data = await tellJoke(), в противном случае Вы должны использовать цепочку обещаний:

tellJoke()
 .then(joke => console.log(joke))
 .catch(err => console.log(err))
0 голосов
/ 24 апреля 2020

async функции возвращают обещания. async и await - это простой в использовании синтаксис для обработки обещаний. Поэтому, когда вы вызываете асинхронную c функцию из неасинхронной c функции, вам нужно рассматривать ее как обещание.

Последние две строки должны быть:

tellJoke()
.then ( function (data) {
          console.log(data);
        })
.catch ( function (error) {
          console.error (error);
       })

Вы можете сократить это

tellJoke()
.then ( console.log )
.catch ( console.error )
0 голосов
/ 24 апреля 2020

Это потому, что async function s возвращает обещание, которое соответствует их возвращаемому значению. Вы не можете написать синхронный код, который обещает await.

Вы можете, однако, обернуть свой код в асинхронный c IIFE, например:

async function tellJoke() {
    let joke = await getJoke()
    return joke
}

;(async function (){

const data = await tellJoke()
console.log(data)

})();

Или вы можно использовать Promise.prototype.then. then выполняет указанный обратный вызов после разрешения обещания.

async function tellJoke() {
    let joke = await getJoke()
    return joke
}

tellJoke().then(data => {
    console.log(data)
})
...