2012-11-02 3 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의? 세 개의 URL이 있습니다
  2. 왜 배열 내용이 마지막 요소 만 반환합니까? 다른 두 개의 누락 된 요소는 어디에 있습니까?

답변

1

저는 좀비에 익숙하지 않지만 이것이 클로저 문제라고 확신합니다. i은 그것이 생각할 때 생각하는 것과 다릅니다. 클로저에 대한 정보는 JavaScript closure inside loops – simple practical example을 참조하십시오. 기본적으로 당신의 요청은 비동기 적이지만 계속 돌아 가지 않을 때 루프가 계속됩니다. 3 개의 URL을 모두 반복 했으므로 3 개의 요소가 생겼습니다. 그러면 모두 3을 삽입합니다. 값을 네 번째 요소에 추가합니다. 마지막으로 한 번 이기면 마이크로 소프트가 모두 볼 수 있습니다.

+0

조금 두껍기 때문에 죄송합니다. 귀하가 저에게 준 링크에 대한 득표 수를 기준으로 funcs 배열의 내용은 여전히 ​​실제 값이 아니라 다음과 같습니다 : 배열 내용 : function() {console.log ("My value :"+ i); }, function() {console.log ("My value :"+ i); }, function() {console.log ("My value :"+ i); } – Caracos

관련 문제