0

次のコードは、soupselect のデモの例を変更したものです。基本的に、いくつかの html をフェッチし、リンクのリストを出力して変数に保存します。

crawl = function(host)
    var select = require('soupselect').select,
        htmlparser = require("htmlparser"),
        http = require('http'),
        sys = require('sys');

    // fetch some HTML...
    var http = require('http');
    var client = http.createClient(80, host);
    var request = client.request('GET', '/',{'host': host});

    var newPages = []

    request.on('response', function (response) {
        response.setEncoding('utf8');

        var body = "";
        response.on('data', function (chunk) {
            body = body + chunk;
        });

        response.on('end', function() {

            // now we have the whole body, parse it and select the nodes we want...
            var handler = new htmlparser.DefaultHandler(function(err, dom) {
                if (err) {
                    sys.debug("Error: " + err);
                } else {

                    // soupselect happening here...
                    var titles = select(dom, 'a.title');

                    sys.puts("Top stories from reddit");
                    titles.forEach(function(title) {
                        sys.puts("- " + title.children[0].raw + " [" + title.attribs.href + "]\n");
                        newPages.push(title.attribs.href);
                    })
                }
            });

            var parser = new htmlparser.Parser(handler);
            parser.parseComplete(body);
        });
    });
    request.end();
}

私が本当に欲しいのは、この関数が返すnewPages ことnewPages = crawl(host)です。問題は、これが理にかなっているのか、または return ステートメントをどこに置くべきかわかりません。リクエストが終了する前に newPages が存在することがわかりますが、リクエストが終了すると空になります。

その関数に戻り値を持たせるにはどうすればよいnewPagesですか?

4

2 に答える 2

1

フェリックスは正しい、あなたはできません。これはあなたが得ることができる最も近いものです:

関数の署名を次のように変更します

crawl = function(host, done)

関数本体を次のように更新します。

titles.forEach(function(title) {
                        sys.puts("- " + title.children[0].raw + " [" + title.attribs.href + "]\n");
                        newPages.push(title.attribs.href);
                        done(newPages);
                    })

その後、次のようにクロールを呼び出すことができます:

var processNewPages = function(pages){
// do something with pages here
...
};

crawl(host, processNewPages);
于 2013-07-03T07:18:34.183 に答える