结果应为60但不是,它给出输出20,40,60。
var request = require("request"),
cheerio = require("cheerio"),
urls = [];
for(var pages =1; pages <=3; pages++){
var target = "http://realestate.com.kh/real-estate-for-sale-in/all/"+pages;
request(target, function(error, response, html){
if(!error && response.statusCode == 200){
var $ = cheerio.load(html);
$(".listing > header > h2 > a").each(function(){
var url = this.attribs.href;
urls.push(url);
});
console.log(urls.length);
}
});
}
有什么问题?
答案 0 :(得分:1)
我猜每个页面都有20个网址,你打印每个异步调用的总网址数,因此是20,40,60。使用Promise,并在收集所有网址后打印计数:
var request = require("request"),
cheerio = require("cheerio"),
urls = [], promises=[], pages, target = "http://realestate.com.kh/real-estate-for-sale-in/all/";
function getURLs(pageNo){
return new Promise(function(resolve, reject){
request(target+pageNo, function(error, response, html){
if(!error && response.statusCode == 200){
var $ = cheerio.load(html);
$(".listing > header > h2 > a").each(function(){
var url = this.attribs.href;
urls.push(url);
});
resolve();
}else{
reject(error);
}
});
});
}
for(var pages =1; pages <=3; pages++){
promises.push(getURLs(pages));
}
Promise.all(promises).then(function(){
console.log(urls.length);
})
答案 1 :(得分:1)
您的console.log在for循环中。 因此,它将转到第1页,得到20个结果,然后输出。 然后它进入第2页,然后获得另外20个结果,然后输出40。 然后它转到第3页,然后得到另一个20.然后输出60。
将日志放在for循环之外。