Node.js:http结束事件、响应关闭事件和响应结束事件之间的区别



我是NodeJS的新手,在查看了文档并尝试了http.on('finish')res.on('close')res.on('end')之后,我不明白它们之间有什么不同。

http.get(url, res => {
res.setEncoding('utf8'); // returns string object to data event
res.on('data', string => {
const responseObj = responseDataList.find(responseObj => {
return responseObj.url === url;
});
responseObj.data += string;
});
res.on('close', () => {
console.log('[Interruption] connection closed before response was ended.');  // Never fires
})
res.on('error', console.error);
// TODO: find out difference between response.end and response.close and http.finish events
res.on('end', (data, encoding) => {
// Seems to fire at the same time that http.on('finish') fires
current++;

if (counter === current) {
responseDataList.forEach(responseObj => {
console.log(responseObj.data);
})
}
});
})
.on('error', console.error)
.on('finish', () => {
// Seems to fire at the same time that res.on('end') fires
console.log('response sent')
}); // emitted when the response is sent to the OS (not when it is received by the client)

每一种都是什么时候着火的?它们有什么不同?

一旦http.getres对象调用回调,它就会返回一个http.ClientRequesthttp.ClientRequest继承自Stream

因此,根据文件:

finish事件是在调用stream.end()方法之后发出的,并且所有数据都已刷新到底层系统。

http.get的情况下,在发出请求后立即调用stream.end()(请参阅此处)。注意:调用stream.end()与监听res.on('end')事件不同。

因此,对于http.getfinish事件将在发出请求后立即激发,然后res对象事件将开始激发。

您的res对象是实现Readable Stream接口的HTTP.IncomingMessage

根据Readable Stream文档:

当流中没有更多数据要消耗时,将发出"结束"事件。

所以end首先发射,然后是close

同样适用于Readable Streams

当流及其任何底层资源(例如文件描述符)关闭时,会发出"关闭"事件。该事件表示将不再发射任何事件,也不会发生进一步的计算。

因此事件按以下顺序启动:finishendclose

最新更新