如何从作为模块导出的请求中获取回调函数的返回值

时间:2019-05-22 05:37:11

标签: 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){
   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]));
    }
});

我正在获取请求模块返回的对象。如何获取回调函数的返回值?

1 个答案:

答案 0 :(得分:0)

使用等待的请求库,然后使用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));
    }
});