Node.js: разница между событием завершения http, событием закрытия ответа и событием окончания ответа - PullRequest
0 голосов
/ 05 февраля 2019

Я новичок в 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') и чем они отличаются?

1 Ответ

0 голосов
/ 08 февраля 2019

Как только http.get вызывает ваш обратный вызов с объектом res, он возвращает http.ClientRequest.http.ClientRequest наследуется от Stream.

Итак, согласно документам :

Событие finish генерируется после вызова метода stream.end(), и все данные былипокраснел к основной системе.

В случае http.get, stream.end() вызывается сразу после выполнения запроса (см. здесь ).Примечание: вызов 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...