以下代码是对soupselect demo example的修改。 它基本上取一些HTML并打印链接列表并将其存储在一个变量:如何获取此node.js函数以返回值
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)
;麻烦是我不知道这是否有意义或在何处放置返回语句。我看到newPages在请求结束前存在,但在请求结束后为空。
如何让该函数的返回值为newPages
?
你不能。如果可以的话,就不需要回调。 [我的答案在这里](http://stackoverflow.com/a/14220323/218196)试图解释同步和异步代码之间的区别。尽管它专注于Ajax,但解决方案适用于任何使用异步代码执行的情况。 –