Ответ 1
Это два разных API, которые позволяют вам получать доступ к одному потоку блоков данных. API 'readable'
был введен в Node 0.10.0 как часть "Потоки 2", поэтому, если вы его ищете, это должно помочь. Ядро проблемы заключается в том, что интерфейс 'readable'
позволяет значительно упростить управление и буферизацию данных.
Пример 'data'
вызывает вашу функцию с куском, и у вас нет выбора, кроме как обрабатывать его, иначе он будет потерян навсегда. В примере 'readable'
функция сообщает вам, что данные доступны, но вы можете прочитать их в любое время. Это позволяет базовой системе знать, действительно ли вы занимались данными, поэтому очень просто поддерживать концепцию, называемую противодавлением.
Например, в сетевом потоке, если клиент отправляет данные по TCP-соединению на сервер, а сервер очень занят, он будет принимать события readable
, но он может предпочесть ждать, чтобы прочитать данные до тех пор, пока на самом деле у него есть ресурсы для обработки данных. Не считывая данные, поток будет буферизировать его, и по мере приближения этого буфера к максимальному размеру поток перестанет считывать пакеты из операционной системы, чтобы избежать слишком большого количества ОЗУ. Затем операционная система начнет отбрасывать пакеты, и поскольку пакеты были удалены, клиент, который отправляет данные, уменьшит скорость отправки данных, чтобы уменьшить количество пакетов.
Все это технически поддерживается с помощью реализации более старого потока "V1", но сделать это было гораздо сложнее.
Итак, в принципе, если вы ожидаете тонну данных, использование "читаемых" или конструирование потоков, которые должны быть переданы по каналам, это очень хорошая идея, но если вы просто читаете бит данных с терминала, то, скорее всего, вы будете см. нулевую разницу.