我在Axios上遇到意外行为,并且不确定是否对axios和Promise的工作方式有误解。基本上,我想做的是创建一个简单的函数,该函数从get请求返回数据。但是,即使我将我的函数显式定义为异步/等待,我仍然会得到一个返回值Promise { <pending> }
。
我的基本问题是:是否可以在全局上下文中运行console.log
,以便能够在记录之前等待axios结果返回?
我的环境是NodeJS,我用npm install --save axios
下载了axios。在这个简单的示例中,我要使用YouTube的channel API。下面是我的代码:
const axios = require('axios');
const KEY = MY_KEY;
// create axios instance
const query = axios.create({
baseURL: 'https://www.googleapis.com/youtube/v3'
});
// presumably, an async / await function should wait for the awaited result before proceeding.
const getYouTubeInfo = async (channelId) => {
let result = await query.get(`/channels`, {
params: {
part: "snippet,contentDetails,statistics",
id: channelId,
key: KEY
}
})
.then(res => {
return res.data;
})
.catch(err => {
console.log(err);
});
return result;
}
// This should return a JSON object. Instead, I get Promise { <pending> }
console.log(getYouTubeInfo('UC29ju8bIPH5as8OGnQzwJyA'));
我在与我的问题有关的堆栈交换中阅读了this article。如果我理解正确,那么async / await在顶层是多余的,因为它仅返回一个Promise。因此,我在底部添加了以下代码,而不是console.log(getYouTubeInfo(channelID))
:
// console.log(getYouTubeInfo('UC29ju8bIPH5as8OGnQzwJyA'));
// still in global context
let data = getYouTubeInfo('UC29ju8bIPH5as8OGnQzwJyA')
.then(dta => {
return dta;
})
.catch(err => {
return err;
})
console.log(data);
但是我仍然得到Promise { <pending> }
。在全局上下文中运行console.log
之前,如何获得此函数以首先返回结果?还是我只能在console.log()
内.then()
?
谢谢!