我正在尝试构建一个简单的网络应用程序,使用nodejs及其2个模块请求和cheerio来抓取网站。
我设法使用以下代码执行此操作:
var printURL=function(url){
request(url, (function() {
return function(err, resp, body) {
if (err)
throw err;
$ = cheerio.load(body);
$('img').each(function(){
console.log($(this).attr('src'));
});
}
} )());
};
它可以在网站上打印图片的URL,但我真正想要做的是创建一个我可以在函数外部使用的URL列表。我试过这种方式,但它返回一个空列表:
var urlList=[];
var printURL=function(url){
request(url, (function() {
return function(err, resp, body) {
if (err)
throw err;
$ = cheerio.load(body);
$('img').each(function(){
urlList.push($(this).attr('src'));
});
}
} )());
};
我该如何解决这个问题?非常感谢
答案 0 :(得分:3)
你需要等到所有回调都完成。
var urlList=[];
var printURL=function(url){
request(url, (function() {
return function(err, resp, body) {
if (err)
throw err;
$ = cheerio.load(body);
var images = $('img');
var counter = images.length;
images.each(function(){
urlList.push($(this).attr('src'));
counter--;
if (counter==0) {
// now we have all images!!
console.log(urlList);
}
});
}
})());
};
这是node.js的异步特性的一部分。如果事情变得更复杂,我建议您使用像async这样的流量控制库。