par*_*tor 2 javascript events http node.js
我是 Node.js 的新手,在查看文档并尝试了 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)Run Code Online (Sandbox Code Playgroud)
http.on('finish'), res.on('end'), res.on('close') 什么时候触发,它们有什么不同?
小智 5
一旦http.get使用该res对象调用您的回调,它就会返回一个http.ClientRequest. 在http.ClientRequest继承Stream。
所以,根据文档:
该
finish事件stream.end()在调用该方法后发出,并且所有数据都已刷新到底层系统。
在 , 的情况下http.get,stream.end()在发出请求后立即调用(请参阅此处)。NB 通话stream.end()与收听不同res.on('end')事件。
因此,对于http.get,finish事件将在发出请求后立即res触发,然后对象事件将开始触发。
你的res对象是一个HTTP.IncomingMessage实现Readable Stream接口的对象
根据Readable Stream文档:
当流中没有更多的数据需要消耗时,将发出 'end' 事件。
所以end先开火然后close
也为 Readable Streams
当流及其任何底层资源(例如文件描述符)已关闭时,将发出 'close' 事件。该事件表示将不再发出更多事件,并且不会发生进一步的计算。
所以事件按以下顺序触发:finish, end,close
| 归档时间: |
|
| 查看次数: |
3592 次 |
| 最近记录: |