【问题标题】:Return https get request body value from async function从异步函数返回 https 获取请求正文值
【发布时间】:2021-03-31 20:07:38
【问题描述】:

我正在尝试获取 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);
}

【问题讨论】:

  • 如果你将回调函数传递给https.get,那么它可能不是一个promise,如果你想使用async/await,它是必需的

标签: javascript node.js https async-await request


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    用 promise 包装 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 = `&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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2021-01-09
      相关资源
      最近更新 更多