我是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 :'(
答案 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)
}