Как получить возвращаемое значение функции обратного вызова из запроса, который экспортируется как модуль - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь разобрать имена и дни рождения всех президентов США.Сначала я получаю все 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 Ответ

1 голос
/ 22 мая 2019

Существуют более простые способы достижения асинхронного поведения, используя ожидаемую библиотеку запросов, а затем используя 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));
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...