次のコードは、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
ですか?