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)
这是因为 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)
})
一个 async
函数返回一个 Promise
,所以你需要等待 tellJoke()
功能。
如果你在一个 async
你只需要 const data = await tellJoke()
,否则你应该使用承诺链。
tellJoke()
.then(joke => console.log(joke))
.catch(err => console.log(err))
async
函数返回承诺。async
和 await
是易于使用的承诺处理语法。所以当你从一个非异步函数中调用一个异步函数时,你需要把它当作一个承诺来处理。
你的最后两行应该是。
tellJoke()
.then ( function (data) {
console.log(data);
})
.catch ( function (error) {
console.error (error);
})
你可以把这个缩写为
tellJoke()
.then ( console.log )
.catch ( console.error )