为什么此JavaScript的结果会重复?

时间:2015-11-30 01:48:45

标签: node.js

结果应为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);
        }
   });
}

有什么问题?

2 个答案:

答案 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循环之外。