Node.js的:HTTP完成事件,响应关闭事件,并且响应结束事件之间的区别
我是新来的Node.js和寻找文档中,并与http.on(“完成”),res.on(“亲密”),并res.on(“结束”)后的实验,我不明白怎么每次都不同。
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
继承。
因此,根据docs:
该
finish
方法被调用之后stream.end()
事件被发射,并且所有的数据已被刷新到底层系统。
在http.get
的情况下,stream.end()
发出请求(参见here)之后立即调用。注:调用stream.end()
是从听res.on('end')
事件不同。
所以对于http.get
,该finish
事件将发出请求后立即开火,然后res
对象事件将开始射击。
你res
目标是实现HTTP.IncomingMessage
接口的Readable Stream
根据该Readable Stream
文档:
当没有更多的数据从流中消耗的发射的“结束”事件。
所以end
火灾第一,然后close
也为Readable Streams
当流和任何其底层资源(文件描述符,例如)已经关闭的射出“关闭”的事件。该事件表示没有更多的事件将被发射,并且不会发生进一步的计算。
因此,事件触发顺序:finish
,end
,close
评论列表(0)
- 暂无评论