Return https 从异步函数获取请求正文值
Return https get request body value from async function
我正在尝试获取 body.totalPages 值,以便我可以在另一个功能块中使用它。它成功 console.logs 但是当我尝试在 getTotalGoals 函数中使用它时返回的值是未定义的。
function delay() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(42);
}, 3000);
});
}
async function getPages(endpoint, teamParam) {
var body = ''
var results = await https.get((endpoint+teamParam), res => {
res.setEncoding('utf8');
res.on("data", data => {
body += data;
});
res.on("end", () => {
body = JSON.parse(body);
return body;
});
});
await delay();
console.log(body.totalPages);
return body.totalPages;
}
async function getTotalGoals(team, year) {
// endpoint config
let endpoint = `https://jsonmock.hackerrank.com/api/football_matches?year=${year}`;
let homeParams = `&team1=${team}`;
let awayParams = `&team2=${team}`;
let homePages = 0;
let awayPages = 0;
let totalWins = 0;
homePages = await getPages(endpoint, homeParams); // undefined here
awayPages = await getPages(endpoint, awayParams);
totalWins += await getWins(endpoint+homeParams, homePages);
totalWins += await getWins(endpoint+awayParams, awayPages);
console.log(totalWins);
}
res.on('data', () => {})
的回调不是承诺。试试这个:
async function getPages(endpoint, teamParam) {
return new Promise((resolve, reject) => {
let body = '';
https.get((endpoint+teamParam), res => {
res.setEncoding('utf8');
res.on("data", data => {
body += data;
});
res.on("end", () => {
body = JSON.parse(body);
resolve(body.totalPages);
});
});
});
}
用承诺包装 https.get
函数,用 resolve()
函数包装 return 值,或者用 reject()
函数包装 return 错误。
示例:
function getPages(endpoint, teamParam) {
var body = ''
return new Promise(function(resolve, reject){
https.get((endpoint+teamParam), res => {
res.setEncoding('utf8');
res.on("data", data => {
body += data;
});
res.on("end", () => {
body = JSON.parse(body);
resolve(body.totalPages)
});
res.on("error", (e) => {
reject(e);
});
});
});
}
用法:
homePages = await getPages(endpoint, homeParams); // undefined here
完整代码:
function delay() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(42);
}, 3000);
});
}
function getPages(endpoint, teamParam) {
var body = ''
return new Promise(function(resolve, reject){
https.get((endpoint+teamParam), res => {
res.setEncoding('utf8');
res.on("data", data => {
body += data;
});
res.on("end", () => {
body = JSON.parse(body);
resolve(body.totalPages)
});
res.on("error", (e) => {
reject(e);
});
});
});
}
async function getTotalGoals(team, year) {
// endpoint config
let endpoint = `https://jsonmock.hackerrank.com/api/football_matches?year=${year}`;
let homeParams = `&team1=${team}`;
let awayParams = `&team2=${team}`;
let homePages = 0;
let awayPages = 0;
let totalWins = 0;
homePages = await getPages(endpoint, homeParams); // undefined here
awayPages = await getPages(endpoint, awayParams);
totalWins += await getWins(endpoint+homeParams, homePages);
totalWins += await getWins(endpoint+awayParams, awayPages);
console.log(totalWins);
}
我正在尝试获取 body.totalPages 值,以便我可以在另一个功能块中使用它。它成功 console.logs 但是当我尝试在 getTotalGoals 函数中使用它时返回的值是未定义的。
function delay() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(42);
}, 3000);
});
}
async function getPages(endpoint, teamParam) {
var body = ''
var results = await https.get((endpoint+teamParam), res => {
res.setEncoding('utf8');
res.on("data", data => {
body += data;
});
res.on("end", () => {
body = JSON.parse(body);
return body;
});
});
await delay();
console.log(body.totalPages);
return body.totalPages;
}
async function getTotalGoals(team, year) {
// endpoint config
let endpoint = `https://jsonmock.hackerrank.com/api/football_matches?year=${year}`;
let homeParams = `&team1=${team}`;
let awayParams = `&team2=${team}`;
let homePages = 0;
let awayPages = 0;
let totalWins = 0;
homePages = await getPages(endpoint, homeParams); // undefined here
awayPages = await getPages(endpoint, awayParams);
totalWins += await getWins(endpoint+homeParams, homePages);
totalWins += await getWins(endpoint+awayParams, awayPages);
console.log(totalWins);
}
res.on('data', () => {})
的回调不是承诺。试试这个:
async function getPages(endpoint, teamParam) {
return new Promise((resolve, reject) => {
let body = '';
https.get((endpoint+teamParam), res => {
res.setEncoding('utf8');
res.on("data", data => {
body += data;
});
res.on("end", () => {
body = JSON.parse(body);
resolve(body.totalPages);
});
});
});
}
用承诺包装 https.get
函数,用 resolve()
函数包装 return 值,或者用 reject()
函数包装 return 错误。
示例:
function getPages(endpoint, teamParam) {
var body = ''
return new Promise(function(resolve, reject){
https.get((endpoint+teamParam), res => {
res.setEncoding('utf8');
res.on("data", data => {
body += data;
});
res.on("end", () => {
body = JSON.parse(body);
resolve(body.totalPages)
});
res.on("error", (e) => {
reject(e);
});
});
});
}
用法:
homePages = await getPages(endpoint, homeParams); // undefined here
完整代码:
function delay() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(42);
}, 3000);
});
}
function getPages(endpoint, teamParam) {
var body = ''
return new Promise(function(resolve, reject){
https.get((endpoint+teamParam), res => {
res.setEncoding('utf8');
res.on("data", data => {
body += data;
});
res.on("end", () => {
body = JSON.parse(body);
resolve(body.totalPages)
});
res.on("error", (e) => {
reject(e);
});
});
});
}
async function getTotalGoals(team, year) {
// endpoint config
let endpoint = `https://jsonmock.hackerrank.com/api/football_matches?year=${year}`;
let homeParams = `&team1=${team}`;
let awayParams = `&team2=${team}`;
let homePages = 0;
let awayPages = 0;
let totalWins = 0;
homePages = await getPages(endpoint, homeParams); // undefined here
awayPages = await getPages(endpoint, awayParams);
totalWins += await getWins(endpoint+homeParams, homePages);
totalWins += await getWins(endpoint+awayParams, awayPages);
console.log(totalWins);
}