Nodejs函数被多次调用

时间:2017-01-05 09:05:45

标签: 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 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()

我怎么能等待块完成?

2 个答案:

答案 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()”