推送到节点请求中的数组()

时间:2013-02-05 23:06:30

标签: javascript node.js

我正在尝试使用RequestCheerio构建一个简单的webscraper。

现在的目标是刮取目标页面(在本例中为http://bukk.it),从页面上的目标选择器中获取文本,然后将其推送到我可以在其他功能中使用的数组。

我理解request()是异步执行的,但不知道如何在函数外部看到可见的数据。

example.js

// dependencies
var request = require('request')
, cheerio = require('cheerio');

// variables
var url = 'http://bukk.it/'; // url to scrape
var bukkits = []; // hold our scraped data

request(url, function(err, resp, body){

  if (err) {
    return
  }

  $ = cheerio.load(body);
  // for each of our targets (within the request body)...
  $('td a').each(function(){
    content = $(this).text();
    // I would love to populate the bukkits array for use later...
    bukkits.push(content);
  })
  console.log(bukkits.length); // everything is working inside request
});

console.log(bukkits.length); // nothing, because request is asynchronous?

// that's cool but... how do I actually get the data from the request into bukkits[] ?

2 个答案:

答案 0 :(得分:2)

基本上,您的整个程序现在必须在回调中进行。在该回调之后,没有代码可以访问异步检索并传递给回调的数据。

这并不像听起来那么糟糕。您可以使用命名函数,如下所示:

request(url, onRequestDone);

function onRequestDone(err, resp, body) {
  var bukkits = []; // not global, make it local

  // as above

  doMoreWork(bukkits);
}

function doMoreWork(bukkits) {
  // stuff after the parsing goes here.
}

答案 1 :(得分:0)

您的代码在请求完成之前结束。

使用代理的永久版本

request = require('request').forever;

使用setTimeout来保持程序正常运行。

setTimeout(function(){}, 1000000);

稍后使用这些值,它也需要在请求调用完成后完成。