繁体   English   中英

返回 https 从异步 function 获取请求正文值

[英]Return https get request body value from async function

我正在尝试获取 body.totalPages 值,以便可以在另一个 function 块中使用它。 它成功地控制台记录它,但是当我尝试在 getTotalGoals function 中使用它时,返回的值是未定义的。

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

Wrap the https.get function with a promise and return the value with the resolve() function or return the error with the reject() function.

例子:

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

res.on('data', () => {})的回调不是 promise。 试试这个:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM