以下代碼是對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,但解決方案適用於任何使用異步代碼執行的情況。 –