Возвращает значение тела запроса https get из асинхронной функции

#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);
            });
        });
    });
}