2012-11-02 206 views
2

我是Node.js的新手。我正在使用zombie.js從一些網站上刮取網頁標題。下面是我的代碼:陣列中缺少元素

var Browser = require("zombie"); 
var util = require("util"); 
halt = require('delayed'); 
title = []; 
url = [ 'http://www.apple.com', 'http://www.microsoft.com', 'http://www.dell.com' ]; 


function getTitles(url){ 
    //console.log('Start scraping title'); 
    var length = url.length; 
    console.log('Total Site to Scrape: '+length); 
    label = 1; 
    for(var i=0;i<length;i++){ 
     browser = new Browser() 
     browser.runScripts = false 
     browser.setMaxListeners(0); 
     browser.visit(url[i], function(e, browser, status, errors) { 
     browser.wait(function(){ 
      title[i] = browser.text('html > head > title'); 
      console.log(label+': '+title[i]); 
      browser.close(); 
      label++; 
     }); 
     }); 
    }; 
} 


getTitles(url); 

halt.delay(function() { 
    console.log('Array Length: '+title.length) 
    console.log('Array Content: '+title) 
}, 10) 

下面是代碼的輸出:

Total Site to Scrape: 3 
1: Apple 
2: Dell Official Site - The Power To Do More | Dell 
3: Microsoft Home Page | Devices and Services 
Array Length: 4 
Array Content: ,,,Microsoft Home Page | Devices and Services 

的一部分,我不明白:

  1. 爲什麼數組的長度返回4而不是3的?只有 三個網址
  2. 爲什麼數組內容只返回最後一個元素?其他兩個缺失的元素在哪裏?

回答

1

我不熟悉殭屍,但我很確定這是一個關閉問題。 i不是你認爲的那樣。看到這個答案:JavaScript closure inside loops – simple practical example關於閉包的一些信息。基本上,即使你的請求是異步的,你的循環仍然會繼續,當他們回來的時候他們沒有這樣做,你已經遍歷所有3個URL,現在你有三個元素......好吧,它插入所有3個值轉換成第四個元素。最後一個勝利,所以你看到微軟。

+0

對不起,有點厚。基於你給我的鏈接的最高票數答案,funcs數組的內容仍然不是實際值,而是: 數組內容:function(){console.log(「My value:」+ i); },function(){console.log(「My value:」+ i); },function(){console.log(「My value:」+ i); } – Caracos