从请求中提取/返回var - Javascript

时间:2016-03-28 03:12:27

标签: javascript node.js request cheerio

我是Node.js中的新手,我正在尝试使用Request中声明的变量,但是我需要在Request.Is之外使用它吗?这可能吗?

示例代码:

//stackExample 

var request = require('request')
    cheerio = require('cheerio')
jsonArr = []
request ({
  url: 'http://youtube.com',
  encoding: 'utf8'
  },
  function (err, resp, body){

    if(!err && resp.statusCode == 200){
      var $ = cheerio.load(body);
      $('.yt-lockup-title').each(function(){
        var title = $(this).find('a').text();
        jsonArr.push({
          titulo: title,
        });
      });
    }
    console.log(jsonArr)         //Here Works!
  }
);

console.log(jsonArr)             //Here not :(, I need works here :'(

3 个答案:

答案 0 :(得分:0)

上面代码的问题是,当请求从http调用返回时,jsonArr中的值被推送,然后将值注入jsonArr。

您希望在该调用返回后访问jsonArr的值。您可以使用promises来执行此操作。

或者只是使用setTimeout进行黑客攻击。

setTimeout(function(){
 console.log(jsonArr); // use value after time interval  
 },1000);              // you can set this value depending on approx time it takes for your request to complete.

或者使用deferred函数libraries参考this

var sequence = Futures.sequence();

sequence
  .then(function(next) {
     http.get({}, next);
  })
  .then(function(next, res) {
     res.on("data", next);
  })
  .then(function(next, d) {
     http.get({}, next);
  })
  .then(function(next, res) {
    ...
  })

答案 1 :(得分:0)

您需要将console.log包装在回调中,如下所示。

以下代码将记录[5]

var jsonArry = [];

var test = function(num, callback){
     jsonArry.push(num);
     callback(jsonArry);
};

test(5, function(data){
     console.log(data);
});

答案 2 :(得分:0)

您的jsonArr变量仅在您的请求函数中有效,因为这等待url响应,而您的外部console.log则逐行执行。您可以创建一个将在匿名函数中调用的函数,以便在请求函数之外使用它。

var request = require('request')
    cheerio = require('cheerio')
jsonArr = []
request ({
  url: 'http://youtube.com',
  encoding: 'utf8'
  },
  function (err, resp, body){

    if(!err && resp.statusCode == 200){
      var $ = cheerio.load(body);
      $('.yt-lockup-title').each(function(){
        var title = $(this).find('a').text();
        jsonArr.push({
          titulo: title,
        });
        updated()
      });
    }
    console.log(jsonArr)      
  }
);

function updated(){
  console.log(jsonArr)
}