将承诺值存储到变量中不解析nodejs。

问题描述 投票:0回答:3

所以我一直在纠结这个问题,我需要一些帮助。首先,我有一个类似于这样的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) 返回一个待定的承诺,而不是预期的返回值,我做错了什么?谢谢。

node.js asynchronous promise async-await
3个回答
0
投票

这是因为 async function的返回一个解析到其返回值的承诺。你不能写同步代码 await的承诺。

然而,你可以将你的代码包裹在一个异步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)
})

0
投票

一个 async 函数返回一个 Promise,所以你需要等待 tellJoke() 功能。

如果你在一个 async 你只需要 const data = await tellJoke(),否则你应该使用承诺链。

tellJoke()
 .then(joke => console.log(joke))
 .catch(err => console.log(err))

0
投票

async 函数返回承诺。asyncawait 是易于使用的承诺处理语法。所以当你从一个非异步函数中调用一个异步函数时,你需要把它当作一个承诺来处理。

你的最后两行应该是。

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

你可以把这个缩写为

tellJoke()
.then ( console.log )
.catch ( console.error )
© www.soinside.com 2019 - 2024. All rights reserved.