Web抓取函数返回“未定义”,但是当我使用console.log时可以使用

问题描述 投票:0回答:1
const cheerio = require("cheerio");
const request = require("request");


function GetPhysicalDmg(champname) {
        request("https://champion.gg/champion/" + champname, (error, response, html) => {
        let matchupData = {}
        if (!error && response.statusCode == 200)
        {
            var $ = cheerio.load(html);
            var row = $('.footer-attr');
            var divvoorscript = row.prev().prev().html();
            eval(divvoorscript);
            var physicaldmg = Number(matchupData.championData.dmgComposition.physicalDmg);
            var magicdmg = Number(matchupData.championData.dmgComposition.magicDmg);
            var truedmg = Number(matchupData.championData.dmgComposition.trueDmg);
            return physicaldmg;
        }
    }); 
}
console.log(GetPhysicalDmg("Nautilus"))

以下日志在控制台中为“未定义”。显然,这是因为request是一个异步函数,并且我尝试使用回调,但是无法理解它的工作原理。

function GetPhysicalDmg(champname) {
        request("https://champion.gg/champion/" + champname, (error, response, html) => {
        let matchupData = {}
        if (!error && response.statusCode == 200)
        {
            var $ = cheerio.load(html);
            var row = $('.footer-attr');
            var divvoorscript = row.prev().prev().html();
            eval(divvoorscript);
            var physicaldmg = Number(matchupData.championData.dmgComposition.physicalDmg);
            var magicdmg = Number(matchupData.championData.dmgComposition.magicDmg);
            var truedmg = Number(matchupData.championData.dmgComposition.trueDmg);
            console.log(physicaldmg);
        }
    }); 
}

这将按原样返回值。

javascript node.js web-scraping callback
1个回答
0
投票

这就是我要做的:

const axios = require('axios');
const cheerio = require('cheerio');

const getPhysicalDmg = async champname => {
  let request = await axios.get("https://champion.gg/champion/" + champname)
  let matchupData = {}
  var $ = cheerio.load(request.data);
  var row = $('.footer-attr');
  var divvoorscript = row.prev().prev().html();
  eval(divvoorscript);
  var physicaldmg = Number(matchupData.championData.dmgComposition.physicalDmg);
  var magicdmg = Number(matchupData.championData.dmgComposition.magicDmg);
  var truedmg = Number(matchupData.championData.dmgComposition.trueDmg);
  return physicaldmg;
}

;(async function(){
  console.log(await getPhysicalDmg("Nautilus"))
})()

希望这种方式不会造成混淆,至少对我来说是这样。同样,在中间进行评估通常是一个非常糟糕的主意。

© www.soinside.com 2019 - 2024. All rights reserved.