5

我有这段代码,但我无法创建一个新数组以供进一步使用:

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]);
}

当我运行代码时,它正在列出undefined。但是,如果我这样写代码:

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]);
  }   
});

然后它显示正确的结果,undefined但当我想稍后使用它时。有人可以帮我解决这个问题。

4

2 回答 2

4

Node.js 是异步的,这意味着当您打印出数组时,抓取尚未完成。

我不完全确定你的最终目标是什么,但这里有一种方法可以通过最小的改变来做你正在尝试的事情:

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]);}
})
于 2014-08-16T20:31:39.457 回答
2

Catalyst 是对的,问题是您没有等待异步请求调用完成。这是我的解决方案:

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(','));
})

在这里,我定义了一个进行请求调用的函数,它接受标准节点回调约定中的回调,将错误消息作为第一个参数,将结果作为第二个参数。然后使用将打印结果的回调调用该方法。

于 2014-08-17T16:07:38.573 回答