承诺我的 https.get() 函数返回 Promise { <pending> }

Promisifying my https.get() function is returning Promise { <pending> }

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

为什么我无法获得下面尝试的异步操作?或者有更好的方法吗?基本上我只是想用 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)
      });

然而,承诺仍未正确交付。如果我对数据

做一个简单的 console.log
async function getApi() {
  let url = [url redacted]
  const data = await myRequest(url);
  console.log(data)
}

它将 return Promise { <pending> } 然后 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 中的那个对象,但是,如果我试图访问这个对象中的任何东西,它只是 returns Promise { <pending> }。如:

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

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

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

将getApi函数重写为:

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

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