#javascript #node.js #https #async-await #request
#javascript #node.js #https #асинхронный-ожидание #запрос
Вопрос:
Я пытаюсь получить значение body.TotalPages, чтобы я мог использовать его в другом функциональном блоке. Это успешно консоль.регистрирует его, однако возвращаемое значение не определено, когда я пытаюсь использовать его в функции 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 = `amp;team1=${team}`;
let awayParams = `amp;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);
}
Комментарии:
1. Если вы передаете функцию обратного
https.get
вызова, то, скорее всего, это не обещание, которое требуется, если вы хотите использовать async / await
Ответ №1:
Оберните https.get
функцию обещанием и верните значение с resolve()
помощью функции или верните ошибку с reject()
помощью функции.
Пример:
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 = `amp;team1=${team}`;
let awayParams = `amp;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);
}
Ответ №2:
Обратный вызов for 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);
});
});
});
}