2016-03-28 50 views
0

我是Node.js中的新成员,我试图使用在Request中声明的变量,但我需要在Request.Is之外使用它。从请求中提取/返回var - Javascript

样品的编号:

//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 :'(

回答

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) 
} 
0

上面代码问题是,当从HTTP呼叫请求返回,接着喷射值插入jsonArr在jsonArr值被推动。

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

或者只是使用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. 

或者使用延迟执行功能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) { 
    ... 
    }) 
0

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

下面的代码将记录[5]

var jsonArry = []; 

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

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