将promise值存储到变量中而不解析nodejs



所以我已经为这个问题挣扎了一段时间,我需要一些帮助。因此,首先我有一个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(返回一个挂起的promise,而不是预期的返回值,我做错了什么?谢谢

这是因为async function返回一个解析为其返回值的promise。您无法编写await承诺的同步代码。

然而,您可以将代码封装在异步IIFE中,如下所示:

async function tellJoke() {
let joke = await getJoke()
return joke
}
;(async function (){
const data = await tellJoke()
console.log(data)
})();

或者您可以使用Promise.prototype.then。一旦promise解析,then将执行指定的回调。

async function tellJoke() {
let joke = await getJoke()
return joke
}
tellJoke().then(data => {
console.log(data)
})

async函数返回一个Promise,因此需要等待tellJoke()函数。

如果你在async函数中,你只需要const data = await tellJoke(),否则你应该使用承诺链:

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

async函数返回Promises。asyncawait是用于承诺处理的易于使用的语法。因此,当您从非异步函数调用异步函数时,需要将其视为promise。

最后两行应该是:

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

你可以缩写这个

tellJoke()
.then ( console.log )
.catch ( console.error )

最新更新