Самое важное различие между управлением обработчиками событий и использованием 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 с учетом функциональности для управления потоками, если это возможно.В большинстве случаев это поможет вам избежать дополнительной сложности, и не будет медленнее по сравнению с ручным управлением.