2016-04-11 5 views
-1

Я следовал за кучу учебников о том, как сделать немного веб-соскоб в узле JSNodeJS Ответный

(я не являюсь полным нуб так что любое понимание по вопросу, независимо от того, как основные, помогает)

Я пытаюсь найти способ сохранить «urls» массива в текстовом файле, но столкнулся с несколькими проблемами. Это асинхронно, потому что сбор ссылок занимает много времени, и я не могу понять, как обратные вызовы работают в узле.

Вот что я до сих пор:

var request = require('request'); 
var cheerio = require('cheerio'); 
var links = []; 

request('http://www.reddit.com', function(err, resp, body){ 
    if(!err && resp.statusCode == 200){ 
     var $ = cheerio.load(body); 
     $('a.title', '#siteTable').each(function(){ 
      var url = $(this).attr('href'); 
      urls.push(url); 
     }); 
     console.log(links); 
    } 
}); 

Я думал просто положить весь этот «раздел» на тайм-аут, который даст ему достаточно времени, чтобы составить список ссылок, но я хотел бы видеть, что более чистый и более правильный способ сделать это.

Может ли кто-нибудь показать мне, как я буду использовать обратный вызов для этого, чтобы я мог настроить функцию печати для сохранения вывода после этого?

+0

http://blog.slaks.net/2014-12-23/parallelism-async-threading-explained/ – SLaks

+0

Вы могли бы написать функцию который берет в ваш массив, а затем сохраняет его в файл. В принципе, замените 'console.log (links)' на 'saveLinks (ссылки)' где 'saveLinks' - это функция, которую вы написали. –

+0

Просто запустите свой код после получения ответа. – SLaks

ответ

0

Все выглядит хорошо, за исключением одной ошибки. У вас нет массива с именем urls, но вы затем нажимаете на него. Просто измените urls.push(url); на links.push(url); поэтому у вас есть

var request = require('request'); 
 
var cheerio = require('cheerio'); 
 
var links = []; 
 

 
request('http://www.reddit.com', function(err, resp, body){ 
 
    if(!err && resp.statusCode == 200){ 
 
     var $ = cheerio.load(body); 
 
     $('a.title', '#siteTable').each(function(){ 
 
      var url = $(this).attr('href'); 
 
      links.push(url); 
 
     }); 
 
     console.log(links); 
 
    } 
 
});

+0

Хороший улов! Я делал последнюю замену вручную, потому что мне хотелось позже ссылаться на «urls». Я закончил решение моей проблемы с тайм-аутом в 15 секунд на дополнительной функции записи в текстовый файл. –

+0

Рад, что проблема решена. В общем, использование setTimeout обычно является довольно хриплым решением (а не тем, что я никогда не делал). Так что если у вас все еще есть вопросы, – aray12

Смежные вопросы