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)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 次 | 
| 最近记录: |