Node.js的:HTTP完成事件,响应关闭事件,并且响应结束事件之间的区别

问题描述 投票:1回答:1

我是新来的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)

当DO http.on( '完成'),res.on( '结束'),res.on( '亲密'),火灾和如何它们有什么不同?

javascript node.js http events
1个回答
2
投票

只要http.get调用与res您的回调对象返回一个http.ClientRequest。该http.ClientRequestStream继承。

因此,根据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

当流和任何其底层资源(文件描述符,例如)已经关闭的射出“关闭”的事件。该事件表示没有更多的事件将被发射,并且不会发生进一步的计算。

因此,事件触发顺序:finishendclose

热门问题
推荐问题
最新问题