2

Node.js は初めてです。いくつかの Web サイトから Web ページのタイトルを取得するために、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. 配列の長さが 3 ではなく 4 を返すのはなぜですか? URLが3つしかない
  2. 配列の内容が最後の要素のみを返すのはなぜですか? 他の 2 つの欠落している要素はどこにありますか?
4

1 に答える 1

1

私はゾンビに精通していませんが、これは閉鎖の問題であると確信しています。iあなたがそれだと思うとき、あなたがそれだと思うものではありません。この回答を参照してください:ループ内の JavaScript クロージャー –クロージャーに関するいくつかの情報については、簡単で実用的な例。基本的に何が起こっているかというと、リクエストが非同期であってもループが継続し、リクエストが完了していないため、戻ってきたときに 3 つの URL すべてをループし、3 つの要素を取得した後、3 つすべてを挿入します。値を 4 番目の要素に入れます。最後の 1 つが勝つので、Microsoft だけが表示されます。

于 2012-11-02T20:39:27.273 に答える