Save array from cheerio to node.js

I have this code and I cannot create a new array for further use:

var request = require("request");
var cheerio = require("cheerio");
var pag = [];
request('http://www.tastez.ro/tv.php?query=sopcast', function(error, response, body) {
  if (error) {
    return console.error('upload failed:', error);
  }

  var $ = cheerio.load(body);
    links = $(".page a"); //use your CSS selector here
    $(links).each(function(i, link){    
      var   sop = $(this).attr('href');
      pag[i] = sop;  //aici pun val gasite in locuri in array
    });
  pag.push(', '); 
});
for (var i=0; i<2; i++){
  console.log(pag[i]);
}

      

When I run the code, it lists undefined

. But if I put the code like this:

var request = require("request");
var cheerio = require("cheerio");
var pag = [];
request('http://www.tastez.ro/tv.php?query=sopcast', function(error, response, body) {
  if (error) {
    return console.error('upload failed:', error);
  }

  var $ = cheerio.load(body);
  links = $(".page a"); //use your CSS selector here
  $(links).each(function(i, link){    
    var sop = $(this).attr('href');
    pag[i] = sop;  //aici pun val gasite in locuri in array
  });
  pag.push(', ');
  for (var i=0; i<2; i++){
    console.log(pag[i]);
  }   
});

      

Then it displays the correct result, but still undefined

when I would like to use it later. Can someone help me with this.

+3


source to share


2 answers


Node.js is asynchronous, which means the scrape hasn't finished yet when you go to print the array.

I'm not entirely sure what your ultimate goal is, but here's a way to do what you are trying with minimal changes:



var request = require("request");
var cheerio = require("cheerio");
var pag = [];

var scrape = function( callback ) {
    request('http://www.tastez.ro/tv.php?query=sopcast', function(error, response, body) {
      if (error) {
        return console.error('upload failed:', error);
      }

    var $ = cheerio.load(body);
     links = $(".page a"); //use your CSS selector here
      $(links).each(function(i, link){    
        var sop = $(this).attr('href');
        pag[i] = sop;  //aici pun val gasite in locuri in array

      });
    pag.push(', '); 
    if (callback) callback()
    });
}
scrape(function() {
    for (var i=0; i<2; i++){
    console.log(pag[i]);}
})

      

+2


source


The catalyst is right, the problem is that you are not waiting for the async call request call to complete. Here is my solution:

function getLinks(callback){

  request('http://www.tastez.ro/tv.php?query=sopcast', function(error, response, body) {
  if (error) {
    callback(new Error('upload failed:', error),null);
  }
  var pag = [];
  var $ = cheerio.load(body);
  links = $(".page a"); //use your CSS selector here
  $(links).each(function(i, link){    
    var sop = $(this).attr('href');
    pag.push(sop);  //aici pun val gasite in locuri in array
  });
  callback(null, pag);

  });

}
getLinks(function(err,links){
  if(err) return console.log(err);
  console.log(links.join(','));
})

      



here i define functions that call the request and it takes a callback in the standard node callback convention, putting the error as the first parameter and the results as the second parameter. This method is then called with a callback that will print the results.

+2


source







All Articles