В чем преимущество использования функции pipe перед res.write - PullRequest
0 голосов
/ 27 февраля 2019

Фреймворк Express.

Когда я отправляю запрос из конечной точки и начинаю получать данные, я могу читать данные порциями и записывать их мгновенно:

responseHandler.on('data', (chunk) => {
  res.write(chunk);
});

Или я могу создать доступный для записи поток и направить ответ на него.

responseHandler.pipe(res)

Очевидно, что функция канала заботится о первом процессе с большим количеством измерений.Что они?

1 Ответ

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

Самое важное различие между управлением обработчиками событий и использованием readable.pipe (доступной для записи) заключается в том, что при использовании pipe:

Поток данных будет автоматически управляться, чтобы целевой поток записи не был перегруженболее быстрым читаемым потоком. Pipe

Это означает, что читаемый поток может быть быстрее, чем записываемый, и pipe обрабатывает эту логику.Если вы пишете код, такой как:

responseHandler.on('data', (chunk) => {
    res.write(chunk);
});

Функция res.write ()

Возвращает: (логическое) false, если поток желает, чтобы вызывающий код ожидал 'событие «сток», которое должно быть сгенерировано перед продолжением записи дополнительных данных;в противном случае правда. Ссылка

Это означает, что записываемый поток может быть не готов к обработке большего количества данных.Таким образом, вы можете управлять этим вручную, как упомянуто в примере writable.write ().

В некоторых случаях у вас нет читаемого потока, и вы можете записывать в доступный для записи поток с помощью writable.write ().Пример

const data = []; // array of some data.

data.forEach((d) => writable.write(d));

Но, опять же, вы должны увидеть, что возвращает writable.write.Если оно ложно, вы должны действовать вручную, чтобы отрегулировать поток.

Другой способ - обернуть ваши данные в читаемый поток и просто направить его.

Кстати, есть одинболее большое преимущество использования труб.Вы можете объединить их в цепочку в соответствии с вашими потребностями, например:

readableStream
    .pipe(modify)      // transform stream
    .pipe(zip)         // transform stream
    .pipe(writableStream);

Суммируя все контрейлер в файле node.js с учетом функциональности для управления потоками, если это возможно.В большинстве случаев это поможет вам избежать дополнительной сложности, и не будет медленнее по сравнению с ручным управлением.

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