2017-01-05 93 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()」的東西