[英]web scraping function returns “undefined” but works when I use console.log
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"))
The following logs "undefined" in the console.以下在控制台中记录“未定义”。 Apparently this is because request is an async function, and I've tried to use callback but can't wrap my head around how it works.显然这是因为请求是异步 function,我尝试使用回调,但无法理解它是如何工作的。
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);
}
});
}
this returns the value as it should.这将返回应有的值。
Here's what I would do:这是我要做的:
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"))
})()
Hopefully this way is less confusing, it is to me at least.希望这种方式不那么令人困惑,至少对我来说是这样。 Also that eval in the middle is a really bad idea in general.此外,中间的 eval 通常是一个非常糟糕的主意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.