我正在使用nodejs中的解析器。因此我请求一个网站并解析HTML。 我正在使用require(“htmlparser”)和require('follow-redirects')。http用于请求。
requestSite(options);
console.log("Done\n");
parser.done();
function requestSite(options) {
http.get(options, function(res) {
console.log("Got response: " + res.statusCode);
res.setEncoding('utf8');
res.on('data', function (chunk) {
parser.parseChunk(chunk.toString('utf8'));
});
}).on('error', function(e) {
console.log("Got error: " + e.message);
});
}
我现在的问题是在requestSite函数实际完成其块之前调用done()导致跟随错误:
在没有调用done()之后写入处理程序 调用reset()
我怎么能等待块完成?
答案 0 :(得分:0)
您没有考虑nodejs的异步性质。它将调用requestSite
然后移动以执行下一个语句并在parser.done
执行完之前调用requestSite
。这样做。
requestSite(options, parser);
console.log("Done\n");
function requestSite(options, parser) {
http.get(options, function(res) {
console.log("Got response: " + res.statusCode);
res.setEncoding('utf8');
res.on('data', function (chunk) {
parser.parseChunk(chunk.toString('utf8'));
})
.on("end", function(){
parser.done();
})
}).on('error', function(e) {
console.log("Got error: " + e.message);
});
}
答案 1 :(得分:0)
这是node.js和事件驱动架构的基础。
Node不像php,python等一行一行编程......
看一下这个简单的例子:
console.log(1);
setTimeout (function(err, res) {
console.log(2);
}, 0);
console.log(3);
你认为它应该打印:1,2,3
但这将打印1,3,2。
在你的例子中,你应该移动
parser.done();
到http请求的“结束”。 目前你有一个获取数据块的事件,所以只需使用: onEnd或类似的东西,而不是放置“parser.done()”