Node.js Nodejs函数被多次调用
我正在nodejs中开发一个解析器。因此,我请求一个网站并解析HTML。 我正在使用require(“htmlparser”)和require('follow-redirects').http处理请求Node.js Nodejs函数被多次调用,node.js,Node.js,我正在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 r
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()后不允许在没有
调用重置()
我怎样才能等待块完成呢?您没有考虑nodej的异步特性。它将调用
requestSite
,然后继续执行下一条语句,并在执行requestSite
之前调用parser.done
。改为这样做
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);
});
}
您没有考虑nodejs的异步特性。它将调用
requestSite
,然后继续执行下一条语句,并在执行requestSite
之前调用parser.done
。改为这样做
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);
});
}
这是node.js和事件驱动架构的基础 节点不是像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请求的“末尾”。
目前,您有一个获取数据块的事件,因此只需使用:
oned或类似的东西,然后放置“parser.done()”这是node.js和事件驱动架构的基础 节点不是像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请求的“末尾”。
目前,您有一个获取数据块的事件,因此只需使用:
ONED或类似的东西,然后放置“parser.done()”是否有可以调用它的on('end')事件?是否有可以调用它的on('end')事件?