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

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.getstream.end()在发出请求后立即调用(请参阅此处)。NB 通话stream.end()与收听不同res.on('end')事件。

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

你的res对象是一个HTTP.IncomingMessage实现Readable Stream接口的对象

根据Readable Stream文档:

当流中没有更多的数据需要消耗时,将发出 'end' 事件。

所以end先开火然后close

也为 Readable Streams

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

所以事件按以下顺序触发:finish, end,close