Javascript 如何从作为模块导出的请求中获取回调函数的返回值
我试图解析所有美国总统的名字和生日。首先我得到所有的URL。我以前导出过一个模块,在该模块中,我试图通过使用URL调用请求来返回一个包含总统姓名和生日的对象。我无法检索主js文件中的数据 我试图做到这一点而不使用承诺 我正在导出的模块:Javascript 如何从作为模块导出的请求中获取回调函数的返回值,javascript,jquery,node.js,callback,node-modules,Javascript,Jquery,Node.js,Callback,Node Modules,我试图解析所有美国总统的名字和生日。首先我得到所有的URL。我以前导出过一个模块,在该模块中,我试图通过使用URL调用请求来返回一个包含总统姓名和生日的对象。我无法检索主js文件中的数据 我试图做到这一点而不使用承诺 我正在导出的模块: const request = require('request'); //to make HTML requests const cheerio = require('cheerio'); const POTUSParse = function(url){
const request = require('request'); //to make HTML requests
const cheerio = require('cheerio');
const POTUSParse = function(url){
return request(url,(error,response,HTML) => {
if(!error && response.statusCode == 200){
const $ = cheerio.load(HTML);
const presidentName = $("#firstHeading").text();
const bdayString = $(".bday").text();
return {
"name" : presidentName,
"bday" : bdayString
};
}
});
}
module.exports = POTUSParse;
主JS文件:
const POTUSParse = require('./getName&BDAYModule');
const request = require('request');
const cheerio = require('cheerio');
request("https://en.wikipedia.org/wiki/List_of_Presidents_of_the_United_States",(error,response,html) => {
if(error || response.statusCode != 200){
return;
}
const wikiURLs = [];
const $ = cheerio.load(html);
$("big a").each((index,rawDOMElement) => {
wikiURLs.push($(rawDOMElement).attr("href"));
});
for(var i=0;i<wikiURLs.length;i++){
console.log(POTUSParse("https://en.wikipedia.org" + wikiURLs[i]));
}
});
constpotusparse=require('./getName&BDAYModule');
const request=require('request');
const cheerio=需要(“cheerio”);
请求(“https://en.wikipedia.org/wiki/List_of_Presidents_of_the_United_States,(错误、响应、html)=>{
if(错误| | response.statusCode!=200){
回来
}
常量wikiurl=[];
const$=cheerio.load(html);
$(“大a”)。每个((索引,RAWDEMENT)=>{
push($(rawDOMElement.attr(“href”));
});
对于(var i=0;i有更简单的方法来实现异步行为,方法是使用可等待的请求库,然后使用async/await而不是回调
使当前代码正常工作的最佳方法是在导出的函数中返回一个由回调函数解析的承诺:
const request = require('request'); //to make HTML requests
const cheerio = require('cheerio');
const POTUSParse = function(url) {
return new Promise((resolve, reject) => {
request(url, (error, response, HTML) => {
if (!error && response.statusCode == 200) {
const $ = cheerio.load(HTML);
const presidentName = $("#firstHeading").text();
const bdayString = $(".bday").text();
resolve({
"name": presidentName,
"bday": bdayString
});
}
})
})
}
module.exports = POTUSParse;
然后,您可以关注承诺的解决:
const POTUSParse = require('./getName&BDAYModule');
const request = require('request');
const cheerio = require('cheerio');
request("https://en.wikipedia.org/wiki/List_of_Presidents_of_the_United_States",(error,response,html) => {
if(error || response.statusCode != 200){
return;
}
const wikiURLs = [];
const $ = cheerio.load(html);
$("big a").each((index,rawDOMElement) => {
wikiURLs.push($(rawDOMElement).attr("href"));
});
for(var i=0;i<wikiURLs.length;i++){
POTUSParse("https://en.wikipedia.org" + wikiURLs[i]).then(potus => console.log(potus));
}
});
constpotusparse=require('./getName&BDAYModule');
const request=require('request');
const cheerio=需要(“cheerio”);
请求(“https://en.wikipedia.org/wiki/List_of_Presidents_of_the_United_States,(错误、响应、html)=>{
if(错误| | response.statusCode!=200){
回来
}
常量wikiurl=[];
const$=cheerio.load(html);
$(“大a”)。每个((索引,RAWDEMENT)=>{
push($(rawDOMElement.attr(“href”));
});
对于(var i=0;i console.log(potus));
}
});
如果不使用承诺或异步,您打算如何知道POTUSParse请求何时有响应?