我是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.get
用res
对象调用回调,它就会返回一个http.ClientRequest
。http.ClientRequest
继承自Stream
。
因此,根据文件:
finish
事件是在调用stream.end()
方法之后发出的,并且所有数据都已刷新到底层系统。
在http.get
的情况下,在发出请求后立即调用stream.end()
(请参阅此处)。注意:调用stream.end()
与监听res.on('end')
事件不同。
因此,对于http.get
,finish
事件将在发出请求后立即激发,然后res
对象事件将开始激发。
您的res
对象是实现Readable Stream
接口的HTTP.IncomingMessage
根据Readable Stream
文档:
当流中没有更多数据要消耗时,将发出"结束"事件。
所以end
首先发射,然后是close
同样适用于Readable Streams
当流及其任何底层资源(例如文件描述符)关闭时,会发出"关闭"事件。该事件表示将不再发射任何事件,也不会发生进一步的计算。
因此事件按以下顺序启动:finish
、end
、close