Проблемы с передачей ссылок из одной функции в другую - PullRequest
0 голосов
/ 19 октября 2018

Я написал очень маленький скрипт в node.js, используя request и cheerio для разбора titles, подключенного к links, который я уже вырезал с его целевой страницы.

Проблема в том, что я не могу найти никакой идеи относительно того, как я могу передавать ссылки (заполненные из первой функции) на вторую функцию, чтобы получить оттуда заголовки.Я очень плохо знаком с node.js, поэтому не могу понять, как вернуть результат из первой функции и передать их второй.

У меня ошибка:

for (const link of links) {
                   ^
ReferenceError: links is not defined

Это полный скрипт:

var request = require('request');
var cheerio = require('cheerio');

const url = 'https://news.ycombinator.com';

request(url, function (error, response, html) {
  if (!error && response.statusCode == 200) {
    var $ = cheerio.load(html);
    $('.title .storylink').each(function(){
    var links = $(this).attr("href");
    });
  }
});

for (const link of links) {
  (function(url) {
    request(url, function (error, response, html) {
      if (!error && response.statusCode == 200) {
        var $ = cheerio.load(html);
        var title = $('title').eq(0).text();
        console.log(title);
      }
    });
})(link);
}

Кстати, селекторы, используемые в скрипте, безупречны.Все, что мне нужно знать, это передать результат от одной функции к другой.

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Кажется, я нашел решение.Он сделал свое дело:

var request = require('request');
var cheerio = require('cheerio');

const url = 'https://news.ycombinator.com';

function getItems(callback){
  request(url, function (error, response, html) {
    if (!error && response.statusCode == 200) {
      var $ = cheerio.load(html);
      $('.title .storylink').each(function(){
      var links = $(this).attr("href");
      return callback(links,false);
      });
    }
  });
}
getItems((link)=>{
    request(link, function (error, response, html) {
      if (!error && response.statusCode == 200) {
        var $ = cheerio.load(html);
        var title = $('title').eq(0).text();
        console.log(title);
      }
    });
});
0 голосов
/ 19 октября 2018

Ваша переменная "links" находится вне области видимости.Он находится за пределами обратного вызова в «запросе».Либо нужно превратить запрос в обещание, либо использовать запрос-обещание, либо переместить цикл for в функцию, чтобы сохранить ссылки в области видимости.

https://www.npmjs.com/package/request-promise

https://scotch.io/courses/10-need-to-know-javascript-concepts/callbacks-promises-and-async

...