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