承诺我的 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 被正确拒绝,它会将其冒泡为异常。
我正在尝试承诺使用 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.logasync 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 被正确拒绝,它会将其冒泡为异常。