Javascript 网页刮片功能返回“;“未定义”;但当我使用console.log时,它可以工作

Javascript 网页刮片功能返回“;“未定义”;但当我使用console.log时,它可以工作,javascript,node.js,web-scraping,callback,Javascript,Node.js,Web Scraping,Callback,控制台中的以下日志为“未定义”。显然,这是因为请求是一个异步函数,我曾尝试使用回调函数,但不知道它是如何工作的 const cheerio = require("cheerio"); const request = require("request"); function GetPhysicalDmg(champname) { request("https://champion.gg/champion/" + champname, (error, response, html

控制台中的以下日志为“未定义”。显然,这是因为请求是一个异步函数,我曾尝试使用回调函数,但不知道它是如何工作的

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"))


这将返回它应该返回的值。

下面是我要做的:

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

希望这种方式不那么令人困惑,至少对我来说是这样。此外,中间的EVE通常是一个非常糟糕的想法。

仔细查看代码。您正在调用
GetPhysicalDmg
函数,但该函数不返回任何内容。看它确实返回了一些东西,看我的第一个例子不,它根本不返回任何东西。示例中的return语句位于回调函数内部。
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"))
})()