2015-11-30 40 views
0

結果應該是60,但它不是,它給輸出20,40,60爲什麼這個JavaScript的結果是重複的?

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

有什麼不對?

回答

1

我猜每個頁面有20個網址,而您打印總網址數爲每個異步調用,因此20,40,60使用承諾,所有的網址收集後打印計數:

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

非常感謝你的傢伙 – july77

1

您的console.log位於您的for循環中。 因此,它將轉到第1頁,獲得20個結果,然後輸出。 然後它進入第2頁,並且獲得另外20個結果,然後輸出40. 然後進入第3頁,然後獲得另一個20.然後輸出60.

將日誌放在for循環之外。

相關問題