异步等待(Axios)返回承诺<待处理>

时间:2019-12-18 23:01:38

标签: javascript node.js async-await axios

我在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()

谢谢!

0 个答案:

没有答案