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. 为什么数组内容只返回最后一个元素?另外两个缺失的元素在哪里?
4

1 回答 1

1

我不熟悉僵尸,但我很确定这是一个关闭问题。i当你认为它是时,它不是你认为的那样。请参阅此答案:循环内的 JavaScript 闭包 -有关闭包的一些信息的简单实用示例。基本上发生的事情是即使您的请求是异步的,您的循环仍在继续,它们没有完成,所以当它们返回时,您已经遍历了所有 3 个 URL,现在您已经有了三个元素......然后它会插入所有 3值到第 4 个元素。最后一个赢了,所以微软就是你所看到的。

于 2012-11-02T20:39:27.273 回答