【问题标题】:Promisifying my https.get() function is returning Promise { <pending> }承诺我的 https.get() 函数正在返回 Promise { <pending> }
【发布时间】:2021-12-01 07:10:58
【问题描述】:

我正在尝试使用 https.get() 从 API 获取数据的函数,以便我可以使用异步等待。这是下面的示例,它检索数据但是如果我做任何事情来访问对象,例如下面显示的theData[0],它只会返回Promise { &lt;pending&gt; }

为什么我无法在下面尝试异步操作?还是有更好的方法来做到这一点?基本上我只是想用 async await 做一个异步操作,我需要使用 https(而不是 fetch、axios 等)。


const myRequest = ((url) => {
  return new Promise((resolve, reject) => {
    https.get(url, res => {
      let data = [];
      res.on('data', chunk => {
        data.push(chunk);
      });
      res.on('end', () => {
         resolve(JSON.parse(data));
      });
      }).on('error', err => {
        console.log('Error: ', err.message);
      });
  });
});


async function getApi() {
  // write your code here
  let url = [url redacted]

  await myRequest(url)
    .then(data => {
      console.log(data[0])
    })
    .catch(err => {
      console.log(err)
    });
}


编辑:使用错误处理程序重构了我的辅助函数:

 }).on('error', err => {
        reject(err)
      });

但是,promise 仍未正确交付。如果我对数据做一个简单的console.log

async function getApi() {
  let url = [url redacted]
  const data = await myRequest(url);
  console.log(data)
}

它将返回Promise { &lt;pending&gt; },然后是 JSON:

Promise { <pending> }
{
  page: 1,
  per_page: 500,
  total: 1,
  total_pages: 1,
  data: [
    {
      date: '5-January-2000',
      open: 5265.09,
      high: 5464.35,
      low: 5184.48,
      close: 5357
    }
  ]
}

我可以在 console.log 中访问该对象,但是,如果我尝试访问该对象中的任何内容,它只会返回 Promise { &lt;pending&gt; }。如:

async function getApi() {
  let url = [url redacted];
  const data = await myRequest(url)
  const {high, open} = data.data[0];
  return `High: ${high} \n Open: ${open}`
}

【问题讨论】:

    标签: javascript node.js es6-promise


    【解决方案1】:

    首先,您还需要处理拒绝,否则错误会导致挂起。将reject(err) 添加到您的错误处理程序以正确冒泡错误。

    一旦您确定问题不是错误,等待使用就需要工作了。 await 是一个工具,它接受一个承诺,然后等待直到它解决同步执行。如果你 then 一个等待的承诺,你不会从等待中得到任何东西。

    将getApi函数改写为:

    async function getApi() {
      let url = [url redacted]
      const data = await myRequest(url);
      console.log(data);
    }
    

    这将获取并记录数据,如果 Promise 被正确拒绝,它将作为异常冒泡。

    【讨论】:

    • 我似乎仍然收到Promise { &lt;pending&gt; },在问题中添加了更多细节
    猜你喜欢
    • 1970-01-01
    • 2021-08-04
    • 2019-12-23
    • 2020-07-09
    • 2017-10-16
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2021-01-03
    相关资源
    最近更新 更多