2017-01-05 90 views
0

我正在使用nodejs中的解析器。因此我请求一个网站并解析HTML。 我正在使用require(“htmlparser”)并要求('follow-redirects')。http为请求。Nodejs函数被多次调用

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函数实际上已经完成了它的大块导致以下错误之前调用:

Writing to the handler after done() called is not allowed without calling a reset()

我如何可以等待块完成?

+0

有一个在(“端”)事件中,你可以调用它? – ojf

回答

0

您没有考虑nodejs的异步性质。它将调用requestSite,然后moveon执行下一个语句并在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); 
}); 
} 
0

那么这是node.js和事件驱动架构的基础。

节点是不是行编程,如PHP,蟒蛇等一行...

看看这个简单的例子:

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()”的东西